1. 程式人生 > 其它 >Delphi 系統[21]關鍵字和保留字 constructor、destructor、property - 建構函式,解構函式、屬性

Delphi 系統[21]關鍵字和保留字 constructor、destructor、property - 建構函式,解構函式、屬性

Delphi 系統[21]關鍵字和保留字 constructor、destructor、property - 建構函式,解構函式、屬性

1、定義:

  • constructor:宣告或定義一個建構函式,可以用於類型別、物件型別、結構型別。結構型別不允許定義無引數的建構函式。當類被例項化時, 首先呼叫此函式,建構函式一般用Create表示, Create方法能夠連帶類中存在的CreateWnd方法.
  • destructor:宣告或定義一個解構函式,可以用於類型別、物件型別。解構函式主要用來釋放物件資源。解構函式只允許覆蓋,不允許過載。在類被釋放時自動呼叫,解構函式通常用Destroy作為函式名.
  • property:宣告或定義一個屬性,可以用於類型別、物件型別、結構型別。屬性分為顯式屬性和隱式屬性兩種,只有宣告為published訪問型別的屬性才是顯式屬性,才可以直接在物件檢視器中檢視。 TEvent事件也是屬性的一種,可以在published下用property進行宣告。

2、示例:

{ 定義類型別 } 
type 
  TMyObj = class(TObject) 
  private 
    FName: string; 
    FAge: Cardinal; 
    FOnTexChange: TEvent;  { 事件 } 
  protected 
  public 
    constructor Create;  { 建構函式 } 
    destructor Destroy; override; { 解構函式 } 
  published 
    property Name: string read FName write FName; { 釋出屬性 } 
    property Age: Cardinal read FAge write FAge; 
    { 釋出事件 TEvent} 
    property OnTextChange: TEvent read FOnTexChange write FOnTexChange; 
  end; 
 
--------------------------------------------------------------------------------------- 
{ 定義結構型別 } 
type 
  MyRec = record 
  private 
    FName: string; 
    FAge: Cardinal; 
  public 
    constructor Create(Name: string); { 建構函式 } 
    { 這裡不能有解構函式 } 
    property Age: Cardinal read FAge write FAge; { 公開屬性 } 
  end; 
 
--------------------------------------------------------------------------------------- 
{ 定義物件型別 } 
type 
  MyObj = object 
  private 
    FName: string; 
    FAge: Cardinal; 
  protected 
  public 
    constructor Create;  { 建構函式 } 
    destructor Destroy; override; { 解構函式 } 
    { 公開屬性 } 
    property Name: string read FName write FName; 
    property Age: Cardinal read FAge write FAge; 
  end; 

3、關於 Constructors 的一些說明:

建構函式是一種建立和初始化例項物件的特殊方法。建構函式的宣告看起來像過程宣告,但它以單詞constructor開頭。示例:

constructor Create;
constructor Create(AOwner: TComponent);

建構函式必須使用預設的暫存器呼叫約定。儘管宣告未指定返回值,但建構函式返回對其建立或呼叫的物件的引用。

一個類可以有多個建構函式,但大多數都只有一個。通常呼叫建構函式Create。

要建立物件,請對類型別呼叫建構函式方法。例如:

MyObject := TMyClass.Create;

這將為堆上的新物件分配儲存,將所有序號欄位的值設定為零,將nil分配給所有指標和類型別欄位,並使所有字串欄位為空。接下來執行建構函式實現中指定的其他操作;通常,根據作為引數傳遞給建構函式的值初始化物件。最後,建構函式返回對新分配和初始化物件的引用。返回值的型別與建構函式呼叫中指定的類型別相同。

如果在類引用上呼叫的建構函式執行期間引發異常,則會自動呼叫銷燬解構函式來銷燬未完成的物件。

當使用物件引用(而不是類引用)呼叫建構函式時,它不會建立物件。相反,建構函式對指定的物件進行操作,只執行建構函式實現中的語句,然後返回對該物件的引用。建構函式通常在物件引用上與繼承的保留字一起呼叫,以執行繼承的建構函式。

下面是一個類型別及其建構函式的示例:

type
  TShape = class(TGraphicControl)
  private
    FPen: TPen;
    FBrush: TBrush;
    procedure PenChanged(Sender: TObject);
    procedure BrushChanged(Sender: TObject);
  public
    constructor Create(Owner: TComponent); override;
    destructor Destroy; override;
    ...
  end;
constructor TShape.Create(Owner: TComponent);
begin
  inherited Create(Owner);  // 初始化繼承的部分 Initialize inherited parts
  Width := 65;  // 更改繼承的屬性 Change inherited properties
  Height := 65;
  FPen := TPen.Create;  // 初始化新欄位 Initialize new fields
  FPen.OnChange := PenChanged;
  FBrush := TBrush.Create;
  FBrush.OnChange := BrushChanged;
end;

建構函式的第一個操作通常是呼叫繼承的建構函式來初始化物件的繼承欄位。然後,建構函式初始化子類中引入的欄位。因為建構函式總是清除它為新物件分配的儲存,所以所有欄位都以零值(序號型別)、nil(指標和類型別)、empty(字串型別)或Unassigned(變數)開頭。因此,除了非零值或非空值之外,無需在建構函式的實現中初始化欄位。

當通過類型別識別符號呼叫時,宣告為虛擬的建構函式等價於靜態建構函式。然而,當與類引用型別結合使用時,虛擬建構函式允許物件的多型構造——也就是說,構造在編譯時型別未知的物件。

  

  

  

建立時間:2021.08.12  更新時間:

部落格園 滔Roy https://www.cnblogs.com/guorongtao 希望內容對你所有幫助,謝謝!