在程式設計師沒有為類定義預設建構函式的情況下,c++編譯器在某些情況下會自動生成預設建構函式。
1.類中包含的其他有預設建構函式的類的物件
例如:class a
private:
int data;
public:
a();
};a::a()
this->data = 10;
}class b
private:
a m_a;
int m_data;
};b類中包含a類的成員物件,而a類有預設建構函式,這時,編譯器會為b類自動生成乙個預設建構函式,用以初始化a類成員變數m_a,生成的**可能如下:
inline
b::b()
m_a.a::a();//呼叫a類建構函式初始化m_a物件
}編譯器自動生成的預設建構函式只負責初始化有預設建構函式的成員物件,其他的一律不負責(不會去處理m_data的初始化,這個該由程式設計師去做)
2.基類有預設建構函式
這種情況與上面的型別,編譯器生成的預設建構函式可能情況下:
inline
deviredclass::deviredclass()
this->base::base();
}3.帶有虛函式的類
這種情況下是由於編譯器需要給每乙個該類的物件設定虛函式表的位址,設定每乙個物件的vptr(指向vtbl)
因此,編譯器需要在類的建構函式中增加這一步操作(這個不是使用者來進行的,只要是有虛函式的類編譯器都會幫助處理該過程)
其實對於每乙個建構函式(無論是編譯器自動生成的還是使用者定義的),編譯器都會在每乙個函式中增加設定vptr。
4.虛擬繼承的類
這個用的實在比較少,因此略過了。
上面提到的是使用者沒有提供預設建構函式的情況。
假設使用者提供了預設建構函式又會是什麼情況
比如使用者提供了預設建構函式,但是函式中沒有去呼叫基類建構函式初始化物件基類部分亦或沒有去呼叫成員物件的預設建構函式
那麼,編譯器會在編譯時在使用者提供的建構函式中幫助使用者增加這些**,無論是預設建構函式還是其他使用者自定義建構函式
總結自《inside the c++ model》
何時編譯器會自動生成預設建構函式
問題 對c 初學者來說存在乙個誤區,如果類沒有定義任何建構函式,編譯器會自動生成預設的建構函式。注意 這種說法是錯誤的。正確的說法 惟有預設建構函式 被需要 的時候編譯器才會合成預設建構函式。那什麼情況下是 被需要 的時候?以下有四種情況編譯器會自動合成預設建構函式 情況1含有類物件資料成員,該類物...
編譯器生成預設建構函式情況
1 類和物件 當乙個a類有預設建構函式,b類中包含a類物件,並且b類沒有建構函式,那麼編譯器會給b類生成預設建構函式 2 繼承 基類有預設的建構函式,派生類沒有顯示給出建構函式。這種情況下,因為建立派生類物件會呼叫基類的建構函式,所以編譯器認為有必要生成派生類建構函式,所以會生成乙個派生類的建構函式...
編譯器預設生成的函式
拷貝控制函式包括 拷貝建構函式 拷貝賦值函式 移動建構函式 移動賦值函式 析構函式。1.建構函式 如果我們沒有定義任何建構函式,編譯器會為我們生成乙個預設的建構函式。如果定義了,則沒有預設建構函式,即不能以class item來定義物件了。因此,不管有沒有定義建構函式,最好自己定義下預設建構函式。2...