inside C 筆記之預設建構函式

2021-05-23 10:39:05 字數 2129 閱讀 1374

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...