c++ annotated reference manual
告訴我們:「
default constructors…
在需要的時候別編譯器產生出來」。這裡的需要是編譯器的需要,不是程式的需要,程式的需要是程式設計師的責任。
編譯器合成出乙個
default constructor
只執行編譯器所需的行動。也就是說如果乙個
class
沒有任何建構函式,編譯器不一定會為它合成乙個
defualt construtor
。只有以下
4中情況,編譯器才會為
class
在需要的時候合成乙個
default constructor. i.
帶有default constructors
的member class object.
例如:
class foo ;
class bar ;
void foo_bar() ...
}
這裡的bar就被合成了乙個
default constructor
。合成的目的就是呼叫
foo的
default constructor
。但它不對
str做任何處理,這是程式設計師的責任。如果
class
中有多個
member class object
有defautl constructor,
則按照在
class
中宣告次序依次呼叫它們的
default constructor.
ii.帶有default constructor
的base class
例如:
class base
class dervce:public base
void bd()
這個dervce
在需要的時候編譯器為其合成了乙個
default constructor
。合成的目的就是呼叫基類的
defualt constructor
。如果有多個,按照宣告的次序依次呼叫。
iii.另外兩種情況也需要合成帶有乙個
virtual function
的class
defualt constructor. 1.
class
宣告(或繼承)乙個
virtual function. 2.
class
派生自乙個繼承串鏈,其中有乙個或更多的
virtual base classes.
例如:class widget ;
void flip( const widget& widget )
// presuming bell and whistle are derived from widget
void foo()
下面的兩個擴充套件操作將會發生在編譯期間發生:
1.乙個
vtbl
會被編譯器產生出來,內放
class
的virtual
位址。2.
在每乙個
class object
中,乙個額外的
vptr
會編譯器合成出來。
合成的目的就是為
vptr
設定處置。對於
class
的每乙個
construction
,編譯器都會插入相關**,如果沒有
default constructor
,編譯器會合成乙個。
iv.帶有乙個
virtual base calss
的class
virtual base calss
的實現方法在不同的編譯器之間有極大的差異,然而,每一種實現法的共通點在於必須使
virtual base
在其每乙個
derived class object
中的位置在執行期準備妥當。
C 學習筆記之建構函式(一)預設建構函式
定義 在未提供顯式的初始值時,用來建立物件的建構函式。舉例 class testclass private int m a int m b public testclass 預設建構函式1 testclass int a,int b 建構函式 testclass int a 10,int b 5 預...
關於建構函式的介紹(四) 使用預設引數的建構函式
有預設引數的建構函式 建構函式中引數的值既可以通過實參傳遞,也可以指定為某些預設值,即如果使用者不指定實參值,編譯系統就使形參的值為預設值。一般來說在類中宣告建構函式的時候,給那些帶有形參的變數直接賦予初值,之後,再在類外進行具體函式體的編寫。或者直接在類中進行定義建構函式的的時候,給形參變數指定數...
C 建構函式之預設建構函式
參考部落格 以下內容是在上述博主的部落格中提煉出來的 一 預設建構函式的含義是啥 主要就是 預設建構函式在呼叫的時候不需要顯示傳入實參的建構函式 二 預設的建構函式的分類 1 無參建構函式 就是沒有引數的建構函式 class sample 2 帶有形參,並且帶有預設值的建構函式 class samp...