初探Object Pascal的类(四)
类的析构函数
析构函数也是一种特殊的方法,此方法在对象消失前会被自动调用。
析构函数可以看成是构造函数的对立面,它通常用来释放类所占的内存,或者做一些清除工作。一个类不一定必须要有一个析构函数,因为基本的类析构函数可以代替。像构造函数一样,析构函数也没有返回值。
尽管类可以有多重析构函数,但它不具有一般性,若只有一个析构程序,就应该把它命名为Destroy,这不只是一个习惯。当要释放类的实例时,就可以调用Free方法,Free方法是TObject类的方法,把类从内存中删除之前,Free方法将调用类的Destroy方法,这是释放有关类所占内存的一般方法。
例如:
var
Rect1, Rect2: TMyRect;
begin
Rect1 := TMyRect.Create; { 0 * 0 的矩形}
Rect2 := TMyRect.CreateVal(0, 0, 100, 100); { 100 * 100 大小的矩形}
{ do some thing ...}
Rect1.Free;
Rect2.Free;
end.
下面继续对TMyRect类进行修改,加入了析构函数(为了简明起见,有些代码省略了,详细代码请下载)
type
TMyRect = class
private
Left: Integer;
Top: Integer;
Right: Integer;
Bottom: Integer;
Text: PChar; { 新增字段}
public
function GetWidth: Integer;
function GetHeight: Integer;
procedure SetRect(ALeft, ATop, ARight, ABottom: Integer);
{ 两个构造函数}
constructor Create; { 此构造函数用来初始化所有字段为0}
constructor CreateVal(ALeft, ATop, ARight, ABottom: Integer);
{ 此函数用来设置字段为特定值,其中的参数A开头的都是对于构造函数
来说,都是局部的,,都以A开头,用来区别局部变量和字段的。
以A开头是一种习惯。
}
destructor Destroy; override; { 必须要加上override}
end;
{ TMyRect }
constructor TMyRect.Create;
begin
inherited Create;
{ 给Pchar类型字段分配内存}
Text := AllocMem(1024);
end;
destructor TMyRect.Destroy;
begin
{ 释放Text占用的内存}
FreeMem(Text);
inherited;
end;
修改后的TMyRect类在它的构造函数中为一个PChar类型字符串Text分配了存储空间,并在析构函数中释放这些存储空间。
在TMyRect类声明中,我们看看析构函数的声明,如下:
destructor Destroy; override;
注意,结尾有一个关键字override,这个关键字指示编译器覆盖基类中的方法,讲到这里有点超前了,在后面会讲解“继承”。
Note
一般来说,将调用inherited作为构造函数的第一句和析构函数的最后一句。
以上代码均在Delphi7中测试通过,示例代码下载:类的析构函数.rar
posted on 2011-12-30 02:04 pchmonster 阅读(1027) 评论(1) 收藏 举报
浙公网安备 33010602011771号