任何建構函式都可以進行配置,以便在執行自己的**前呼叫其它建構函式。
我們首先看看在建立類的例項時會發生什麼情況。為了例項化派生的類,必須例項化它的基類。而要例項化這個基類,又必須例項化這個基類的基類,這樣一直例項化到
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 學習筆記 建構函式
在建立某個類的物件時,由於對該物件的狀態 資料 不很明確,因此需要對其進行初始化。例如,我們要在長方形中建立乙個物件,或者說新建乙個長方形,那麼我們首先要確定它的長和寬,假如我們無法確定它的長和寬,那麼我們是無法構造出乙個長方形來的。例如,我們要構造乙個長方形,由於建構函式要在建立新物件時使用,因此...