初探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 阅读(986) 评论(1) 编辑 收藏 举报