c 預設建構函式總結

2021-09-29 06:23:03 字數 1088 閱讀 5557

答案:當編譯器需要它的時候!(如果程式需要乙個預設建構函式,那是程式設計師的責任,應該由程式設計師自己定義)並且被合成出來的建構函式只執行編譯器所需的行動。

注意:1.並非所有沒有建構函式的類在編譯時都會生成預設建構函式(但一些大學老師為了講課方便就這麼講的)。

2.只有類中沒有顯示宣告任何建構函式時,編譯器才

可能會為類生成預設建構函式 例:

//定義的fool類

class foo

int main();

class a;

int main()

return 0;

}

上面**中 類a 在構造a時,編譯器會生成會生成乙個預設建構函式,並且被合成出來的建構函式內包含必要的**,能呼叫class b 的預設建構函式來處理 類a 中的資料成員b.注意:被合成出來的建構函式只滿足編譯器的需求,而不是程式的需要,他不會去初始化 成員str

合成出的建構函式偽**如下:

inline a::a()
情況2:在上述例子中,假如類a含有乙個預設建構函式,類a函式如下:

class a

};

此時,因為類a顯示定義了乙個預設建構函式,因此編譯器不會再為類a合成預設建構函式,但是編譯器會悄悄的在類b的建構函式體開始位置(在程式設計師寫的**前)插入一些**用於呼叫類b的建構函式。此題中,**安插在  str=nullptr;之前

如果乙個沒有任何建構函式的類派生自乙個帶有預設建構函式的基類,那麼這個派生類將會被合成出來,用以呼叫它父類的預設建構函式。呼叫順序為宣告順序

class宣告或繼承了乙個 virtual function

因為類中存在虛函式,因此該類將含有乙個虛函式表以供多型時使用,於是在生成類的物件時,物件中必須有乙個能指向虛函式表的虛函式指標,類必須合成乙個預設建構函式用以初始化該虛函式指標

例如磚石型繼承關係,為了解決重複繼承,因此使用了虛繼承

類的繼承中存在虛繼承關係,因此虛繼承的類會共享同乙個虛繼承父類的物件,這種共享是用指標指向完成的,為了初始化該指標,類也必須合成預設初始化函式

以上總結如有錯誤請指正,大家共同進步,謝謝

C 預設建構函式

c 預設建構函式 一直認為若程式設計師沒有自己定義無引數的建構函式,那麼編譯器會自動生成預設建構函式,來進行對成員函式的初始化,但這種認為是有誤的,不全面的.預設的建構函式分為有用的和無用的,所謂無用的預設建構函式就是乙個空函式 什麼操作也不做,而有用的預設建構函式是可以初始化成員的函式。對建構函式...

c 預設建構函式

c 什麼時候合成預設建構函式?c 合成的預設建構函式都做些什麼?以下三個條件同時滿足 源程式中沒有宣告任何建構函式 編譯器需要該類有預設建構函式 程式中需要呼叫預設建構函式 預設建構函式是以編譯單元為單位生成的 什麼時候編譯器需要預設建構函式 該類中有 有預設建構函式 的成員物件 該類繼承乙個有預設...

C 預設建構函式

先說c 新手一般的誤解 1.任何乙個類如果沒有定義預設建構函式,編譯器會自動合成乙個預設建構函式。2.編譯器合成出來的預設建構函式,會顯式的設定類中成員變數的值。先看乙個最基本的例子 從圖中可以看到物件a並沒有被初始化,即編譯器沒有為類a合成乙個預設建構函式。其實c 標準委員會曾敘述,如果沒有任何使...