Delphi高手突破第二章(1),堆与栈,构造与析构函数

Delphi里定义一个类:
type
TMyClass = class
end;

使用方法:
var
MyObj: TMyClass;
begin
MyObj:=TMyClass.Create(); // 构造函数
MyObj.Free(); // 调用析构函数
end;


Delphi的简单类型,如Integer, char, record等,按值传递或使用,其内存空间从栈中分配。
Delphi的复杂类型(class),则按引用传递或使用,其内存空间从堆中分配。

在创建对象时,其构造函数不会被编译器自动调用,没有C++所谓的“默认构造函数”。
调用构造函数来创建对象以及析构函数消灭对象,都是程序员自己的职责。

构造一个对象分为两步:
1. 分配对象本身所占用的内存空间
2. 执行类的构造函数,初始化各数据成员、申请对象需要的其它资源

注意:如果没有为自己的类提供构造函数,它的对象也能建立。原因是编译器自动调用了system.pas的_ClassCreate函数,它为每个对象分配合适的内存。这个动作称为“编译器魔法”(Compiler Magic)。

总结:
1. 对象本身占内存的分配是由编译器完成的,因此即使没有构造函数,对象也一样可以被构造。
2. 构造函数Create的职责只是初始化对象的数据成员。没有构造函数的话,编译器会对所有数据进行清零初始化。
3. 由于Object Pascal中所有类都是从TObject类派生,因此编译器会调用TObject.Create()构造函数。只不过这是一个空函数。


析构函数是Destroy
比如:
type
TMyClass = class
public
Destructor Destroy(); override;
end;
注意:
1. 加上override声明,是为了保证在多态情况下对象能够正确被析构。否则编译器会给出警告。
2. 析构对象的时候,应该调用对象的Free()方法,而不是Destroy()方法。原因是它会自动判断对象本身是否nil,然后再调用Destroy()
3. 同样的,在编译器执行完Free()方法后,会自动插入汇编代码调用_ClassDestory函数,收回对象本身所占的内存空间。

 

posted @ 2012-08-08 20:31  findumars  Views(919)  Comments(0Edit  收藏  举报