使用Delphi物件(宣告 例項化 構造 釋放)

2022-04-11 01:27:37 字數 1734 閱讀 9778

一、宣告和例項化

在使用乙個物件之前,用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);

(十三)kotlin物件表示式和物件宣告

kotlin 用物件表示式和物件宣告來實現建立乙個對某個類做了輕微改動的類的物件,且不需要去宣告乙個新的子類。通過物件表示式實現乙個匿名內部類的物件用於方法的引數中 window addmouselistener object mouseadapter override fun mouseenter...

Kotlin用物件宣告來實現單例模式

在kotlin中,定義單例將是一件十份簡單的事。下面就是kotlin下定義的單例 object dataprovidermanager val alldataproviders collection get 這叫物件宣告,它通過有乙個名稱跟在關鍵字object,有點像變數宣告。物件宣告不是乙個表示式...

委託的宣告與例項化使用

系統訪問資料或呼叫方法有兩種操作方式 一種是通過名稱訪問或呼叫,另一種是通過所在的記憶體位址來訪問呼叫。為了系統的安全與穩定,net framework的clr庫不允許程式通過指標來直接操作記憶體中資料或方法,而是通過託管機制 來訪問記憶體中資料或呼叫記憶體中的方法。委託就是c 提供的一種以託管機制...