Delphi会自动初始化全局变量和类成员变量,但不初始化局部变量

If you don‘t explicitly initialize a global variable, the compiler initializes it to 0. Object instance data (fields) are also initialized to 0. On the Wiin32 platform, the contents of a local variable are undefined until a value is assigned to them.

所以只有局部变量的值需要程序员设定, AutoSize是TControl的Object instance data - FAutoSize, 所以它一定会被compiler初设为0(False).

--------------------------------------------------------------------------------

autosize是类里面的字段
类实例在初始时,会自动fillchar。
var 
  A: Boolean
是栈变量,临时性,随机性是栈变是的特性。

--------------------------------------------------------------------------------

参考:

ms-help://borland.bds4/bds4ref/html/Variables.htm
http://docwiki.embarcadero.com/RADStudio/XE8/en/Variables

--------------------------------------------------------------------------------

另外,Delphi会优化布尔表达式:

function TControl.CheckNewSize(var NewWidth, NewHeight: Integer): Boolean;
var
  W, H, W2, H2: Integer;
begin
  Result := False;
  W := NewWidth;  // cx
  H := NewHeight; // cy
  if DoCanResize(W, H) then // 类函数,给程序员控制的机会,然后再继续传递。程序员要求限制,才进行限制
  begin
    W2 := W;
    H2 := H;
    Result := not AutoSize   // 通常情况下下AutoSize=false,这样Result就已经等于true
    or (DoCanAutoSize(W2, H2) and (W2 = W) and (H2 = H))  // 问题: 编译器优化的话,还会执行这个函数吗?
    or DoCanResize(W2, H2); // 这个函数也是如此
    if Result then
    begin
      NewWidth := W2;
      NewHeight := H2;
    end;
  end;
end;

我觉得上面的代码是故意为之:
 Result := not AutoSize   
    or (DoCanAutoSize(W2, H2) and (W2 = W) and (H2 = H))  
    or DoCanResize(W2, H2);
也就是说,当autoSize=false的时候,就不用执行后面的函数了。只有autoSize=true的时候,才需要执行函数。而现实正是:只有控件运行自动扩展大小的时候,才需要执行后面的函数做进一步检查。

结论:Delphi编译器会优化布尔表达式。1楼的代码之所以这样写,是故意为之,正好符合现实的需求。这样写虽然容易迷惑,但也可认为是VCL创作人员的高超的技巧性。

参考:http://bbs.2ccc.com/topic.asp?topicid=496677

时间: 2025-01-02 08:04:24

Delphi会自动初始化全局变量和类成员变量,但不初始化局部变量的相关文章

C++ Primer 学习笔记_18_类与数据抽象(4)_构造函数、析构函数、explicit关键字、赋值与初始化、类成员的显式初始化

引言: 构造函数确保每个对象在创建时自动调用,以确保每个对象的数据成员都有合适的初始值. 一.构造函数.默认构造函数 1.构造函数 --构造函数是特殊的成员函数 --构造函数是为了保证对象的每个数据成员都被正确初始化 --函数名和类名完全相同 --不能定义构造函数的类型(返回类型),也不能使用void --通常情况下构造函数应声明为公有函数,一般被隐式地调用. --构造函数被声明为私有有特殊的用途,比如单例模式. (1).构造函数可以被重载 一般而言,不同的构造函数允许用户指定不同的方式来初始化

类成员变量初始化的问题

class window{ window(int maker){ System.out.println("window"+maker); } } class House{ window w1 ;//new window(1); window w3 = new window(3); House(){ System.out.print("House"); w3 = new window(33); } window w4 = new window(4); } class

类成员变量初始化

C++类对象的构造顺序是这样的:分配内存->调用构造函数时,隐式/显式的初始化各数据成员->在构造函数内部初始化数据成员. C++类初始化需注意以下几点 1.类里面的任何成员变量在定义时是不能初始化的.    2.一般的数据成员可以在构造函数中初始化.(构造初始化列表初始化和构造函数体内赋值初始化)    3.const数据成员必须在构造函数的初始化列表中初始化.(道理很简单,const成员第一次数据初始化就是发生在类构造数据初始化时,一旦过了此时就会出现问题).    4.static在类的

类成员变量中存在引用,const,和指针类型时需要注意的事项

背景知识 编译器默认生成函数的规则如下: 1.定义一个类时,如果自己没有声明,那么编译器会自动帮助生成一个拷贝构造函数(copy construction),赋值操作符(copy assignment),析构函数(deconstruction). 2.如果没有声明任何构造函数(包括拷贝构造函数),编译器会帮助声明一个默认构造函数. 构造函数(包括编译器生成的默认构造函数)的执行包括两个阶段: 1.初始化阶段 2.构造函数体内代码执行构造的阶段 构造函数执行的两个阶段非常重要,在初始化阶段,如果类

变量,final常量,类成员变量,static关键字,实例变量,静态变量,局部变量

1.常量:又称为final变量,在整个程序中仅能被赋值一次 final int num = 1215; num = 1216; // 错误,仅能赋值一次 2.类成员变量:不在方法中定义的变量即为成员变量,在方法体内定义的变量则为局部变量 成员变量含义:对象的属性 public class Book{ int id; string name; //两个成员变量 public String getName(){ int id = 0;  //局部变量,必须进行赋值或初始化 } } 3.static关

C++ 定义引用型类成员变量

作者 : 卿笃军 1)早在学习C语言的时候,我们就知道,在定义结构体的时候,不能在结构体中定义该结构体类型的变量: struct node { int a; // struct node b; //错 struct node *next; //对 }; 因为,该结构体还在定义中....不知道结构体里面具体有什么内容,所以无法定义对象b.但是可以定义指针*next. 2)现在,C++里面多出来了一个叫引用的东东(很强大): 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样.

Objective-C类成员变量深度剖析

目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objective-C类不能动态添加成员变量 总结 看下面的代码,考虑Objective-C里最常见的操作之一——类成员变量访问. - (void)doSomething:(SomeClass *)obj { obj->ivar1 = 42; // 访问obj对象的public成员变量 int n = sel

Qt一个工程调用另一个工程的类成员变量

一句两句话已经不能表达现在的激动情绪了,唯有感叹知识的博大精深,并把感叹转变为文字. 同一个工程调用其他类成员变量非常简单. 如: 定义 Test1.h中申明成员变量 class A { public: double m_fTest; }; Test1.cpp中改变成员变量的值. m_fTest = 265.78; 然后再类B中调用类A的成员变量m_fTest,并需求类A中改变该值时,类B中也要随之改变: 调用方法:包涵类A的头文件 #include "test1.h" 然后在调用处声

Python的类成员变量默认初始值的坑

问题发现:一个循环内,缺省值初始化同名变量,其中的list成员不是空,会延续之前同名变量的值. 示例代码: # Define class class Variant(): # use def __init__(self, price = 500, description = 'default description', values = ['', '', '']): self.price = price self.description = description self.values = v