C 學習筆記(二) 建構函式的執行序列

2021-04-02 19:05:36 字數 2659 閱讀 4122

任何建構函式都可以進行配置,以便在執行自己的**前呼叫其它建構函式。

我們首先看看在建立類的例項時會發生什麼情況。為了例項化派生的類,必須例項化它的基類。而要例項化這個基類,又必須例項化這個基類的基類,這樣一直例項化到

system.object

為止。結果是無論使用什麼建構函式例項化乙個類,總是要先呼叫system.object.object()

。如果對乙個類使用非預設的建構函式,預設的情況是在其基類上使用匹配於這個建構函式簽名的建構函式。如果沒有找到這樣的建構函式,就使用基類的預設建構函式(根類system.object總是要使用預設的建構函式,因為這個類沒有非預設的建構函式)。

我們以下面這個小**段例子作一些說明:

public

class mybaseclass

public mybaseclass(int i)

}public

class myderivedclass : mybaseclass

public myderivedclass(int i)

public myderivedclass(int i, int j)}

如果以下面的方式例項化

myderivedclass

:myderivedclass myobj =

new myderivedclass();

則發生下面的一系列事件:

1.執行

system.object.object()

建構函式。

2.執行mybaseclass.mybaseclass()建構函式。

3.執行myderivedclass.myderivedclass()建構函式。

如果使用下面的語句:

myderivedclass myobj =

new myderivedclass(4);

則發生下面的—系列事件:

1.執行

system.object.object()

建構函式。

2.執行mybaseclass.mybaseclass(int i)建構函式。

3.執行myderivedclass.myderivedclass(int i)建構函式。

如果使用下面的語句:

myderivedclass myobj =

new myderivedclass(4,8);

則發生下面的—系列事件:

1.執行

system.object.object()

建構函式。

2.執行mybaseclass.mybaseclass()建構函式。

3.執行myderivedclass.myderivedclass(int i, int j)建構函式。

有時需要對發生的事件進行更多的控制。例如,在上面的例項化範例中,需要有下面的事件序列:

1.執行

system.object.object()

建構函式。

2.執行mybaseclass.mybaseclass(int i)建構函式。

3.執行myderivedclass.myderivedclass(int i, int j)建構函式。

使用這個序列可以在編寫mybaseclass(int i)中使用int i引數的**,即myderivedclass(int i, int j)建構函式要做的工作比較少,只需要處理int j引數(假定int i引數在兩種情況下有相同的含義)。我們僅需指定在派生類的建構函式定義中所使用的基類的建構函式,如下所示:

public

class myderivedclass : mybaseclass}

其中,base關鍵字指定.net例項化過程,以使用基類中匹配指定簽名的建構函式。這個例子中使用乙個int引數,所以在例項化序列中應呼叫mybaseclass(int i)。

同時我們也可以使用這個關鍵字指定基類建構函式的字面值。

public

class myderivedclass : mybaseclass……}

這段**將執行以下序列:

1.執行

system.object.object()

建構函式。

2.執行mybaseclass.mybaseclass(int i)建構函式。

3.執行myderivedclass.myderivedclass()建構函式。

下面我們介紹另乙個關鍵字this。這個關鍵字指定在呼叫指定的建構函式前,.net例項化過程對當前類使用非預設的建構函式。

public

class myderivedclass : mybaseclass

……public myderivedclass(int i, int j) : base(i)}

這段**將執行以下序列:

1.執行

system.object.object()

建構函式。

2.執行mybaseclass.mybaseclass(int i)建構函式。

3.執行myderivedclass.myderivedclass(int i,int j)建構函式。

4.執行myderivedclass.myderivedclass()建構函式。

唯一的限制是使用

this

或base

關鍵字只能指定乙個建構函式

。但是如上所示,這並不是乙個很嚴厲的限制,按照上述方式仍可以構造相當複雜的執行序列。

C 學習筆記(二) 建構函式的執行序列

任何建構函式都可以進行配置,以便在執行自己的 前呼叫其它建構函式。我們首先看看在建立類的例項時會發生什麼情況。為了例項化派生的類,必須例項化它的基類。而要例項化這個基類,又必須例項化這個基類的基類,這樣一直例項化到 system.object 為止。結果是無論使用什麼建構函式例項化乙個類,總是要先呼...

C 中類中建構函式的執行序列

所有的類都至少包含乙個建構函式。這些建構函式中可能有乙個預設的建構函式,預設的建構函式沒有引數,與類同名。其它帶引數的建構函式稱為非預設的建構函式。在類的外部不能用私有的建構函式例項化物件,通過把預設的建構函式設定為私有,就可以強制類的使用者使用非預設的建構函式。一些類沒有公共的建構函式,外部 就不...

C 學習筆記 建構函式

在建立某個類的物件時,由於對該物件的狀態 資料 不很明確,因此需要對其進行初始化。例如,我們要在長方形中建立乙個物件,或者說新建乙個長方形,那麼我們首先要確定它的長和寬,假如我們無法確定它的長和寬,那麼我們是無法構造出乙個長方形來的。例如,我們要構造乙個長方形,由於建構函式要在建立新物件時使用,因此...