一、聲明和實例化
在使用一個對象之前,用class關鍵字聲明一個對象。可以在一個程序或單元的type部分聲明一個對象類型:
type TFooObject = class;
除了聲明一個對象類型,通常還需要一個對象的變量,即實例。實例定義在var部分
var FooObject; TFooObject;
在Delphi中通過調用它的一個構造器來建立一個對象的實例,構造器主要是用來為對象創建實例並為對象中的域分配內存進行初始化使得對象處於可使用的狀態。
Delphi的對象至少有一個構造器稱為create(),但是一個對象可以有多個構造器。根據不同的對象類型,Create()可以有不同的參數。
不像在C++中,在Delphi中構造器不能自動調用,程序員必須自己調用構造器,調用構造器的語法如下
FooObject:= TFooObject.Create;
注意這里調用構造器的語法有一點特殊,是通過類型來引用一個對象的Create()方法,而不是像其他方法那樣通過實例來引用。這看上去有點奇怪,但是很有意義。變量FooObject在調用時還沒有被定義,而TFooObject已經靜態地存在於內存之中,靜態調用它的Create()方法是合法的。
通過調用構造器來創建對象的實例,這就是所謂的實例化
注意:當一個對象實例用構造器創建的時候,編譯器將對對象的每一個域經行初始化,你可以放心地認為所有數字被賦值為0,所有指針賦值為NIL,所有字符串為空
二、析構
當用完對象,應該調用這個實例的Free()方法來釋放它。Free()首選進行檢查保證這個對象實例不為NIL,然后調用對象的析構方法Destroy()。自然,析構進行與構造相反的工作,它釋放所有分配的空間,並執行一些其他操作以保證對象能夠適當地移除內存。語法
FooObject.free;
不像調用Create(),這里是調用對象實例的Free()方法,記住不要直接調用Destroy(),而調用更安全的Free()方法,因為Free()首選進行檢查保證這個對象實例不為NIL,然后調用對象的析構方法Destroy()。
警告:在C++中,一個靜態聲明的對象在離開它的作用域時自動調用它的析構方法,但是要對動態生成的對象手動調用析構方法。這個規則在Delphi里面也適用,所有使用Create()動態聲明創建的對象即使離開創建它時候的作用域,它也不會被自動釋放,必須使用Free()方法來動態的析構,除了在Delphi中的隱式動態創建的對象,所以一定要記住這個規則:凡是創建的,都需要釋放。這個規則有兩個重要的特例
1)當對象被其他對象擁有時,它將替你釋放對象。
2)引用技術的對象,當最后一個引用釋放時,它將被析構。
你可能要問,這些方法是怎樣進到對象中的,不需要為這些方法寫代碼,對嗎?是的,剛才討論的方法來自於Object Pascal的基類TObject對象。在Object Pascal中所有的對象都是TObject對象的后代,而不管它們是否是這樣聲明的。因此,下面的聲明:
type TFoo = class;
相當於聲明成
type TFoo = class(TObject);