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

导航