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函数,收回对象本身所占的内存空间。