一 Default Constructor 的建構操作
When is a default constructor
synthesized? 當編譯器需要它的時候,也就是 synthesized constructor 只執行編譯器所需的行動,并不執行程序員某些的設想。
看來以前看C++ Primer 4th時在類的那章相關部分沒有弄懂,P459書上說:
The compiler generates a default constructor automatically only if a class defines
no constructors.只有當一個類沒有定義構造函數時,編譯器才會自動生成一個默認構造函數,但這個不是所說的
synthesized default constructor。
常見的兩個
誤解:
(1)任何class如果沒有定義default constructor ,就會被編譯器合成一個來。
(2)編譯器合成的 default constructor 會明確地為每一個 data member 賦初值。
四種
nontrivial default constructor:
(1)帶default constructor的member class object
如果一個class沒有任何的constructor,但它內含一個member object,后者有default constructor,則該class的 implicit default constructor 就是 nontrival,編譯器需要為此classsynthesize 出一個 default constructor,不過只有在真正需要被調用時才發生。
合成的構造,考構,賦值運算符都是以inline方式完成的。
如果含有多個對象成員,則編譯器按照它們的聲明順序在合成的構造函數中調用它們的default構造函數。
(2)帶default constructor 的base class
一個帶有default constructor 的基類派生出一個沒有任何constructor的派生類,則次派生類的default constructor 被視為 nontrival,會被編譯器synthesize出來,其中調用基類的default constructor
class b{
public:
b():i(1024){};
int i;
};
class d:public b{
};
|
如果我們創建d類的對象,則在其default constructor 中會調用b的。
(3)帶有一個 virtual function的class
其中有兩種情況 1. class聲明或繼承一個 virtual function。 2. class派生自一個繼承串,其中有至少一個 virtual base class。
這2種情況中,如果程序員沒有定義自己的constructor,編譯器會
synthesize a default constructor.期間會發生如下事件:1.一個vtbl被產生,內放有class中 virtual function地址。
2.每一個class object中,一個額外的pointer member(就是vptr)被產生,內含 class vtbl的地址。它們被正確初始化是編譯器的責任。
(4)帶有一個virtual base class的class
virtual base class的實現因編譯器不同而不同,共通目標是定位(locate)virtual base class在其派生類中的位置。
以上四種情況,編譯器會為未聲明constructor的class 合成一個default constructor,這在C++標準中稱為 implicit nontrivial default constructor,只是為了滿足編譯器需要。
這四種情況外的而又沒有聲明default constructor的classes,它們擁有的是 implicit trivial default constructor,實際上并不會被合成出來。
synthesized default constructor 中,只有base class object和member class object會被初始化,其它所有nonstatic build-in類型的成員均不會被初始化,因為編譯器不認為這是必須的工作。
轉http://blog.chinaunix.net/u2/72955/showart_2059086.html
posted on 2009-12-10 15:32
何克勤 閱讀(162)
評論(0) 編輯 收藏 所屬分類:
C/C++