一 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
如果我們創建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
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
|
(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