C++標準中這么說:
對于類X,如果沒有任何用戶定義的構造函數,那么就會有一個默認構造函數被暗自聲明出來;這種函數一般沒有什么用。。。
不過實際上不是什么時候編譯器都生成默認構造函數,但下面集中情況卻一定會為我們生成默認構造函數:
1.類A中包含一個成員是另外一個類B,如果類B定義了默認構造函數。這個時候如果類A沒有定義默認構造函數,編譯器會暗自生成一個默認構造函數來調用調用類B的構造函數來初始化它。
2.類A從類B繼承,類B帶有默認構造函數,那么這個時候編譯器會為類A合并默認構造函數來調用類B的默認構造函數。
3.類A中包含虛函數;如果類A沒有定義默認構造函數,編譯器會為類A合并默認構造函數,其目的是初始化虛函數表,這是因為C++的虛函數表是在運行的時候生成的,而這就是在每個類被初始化的時候。
4.如果類A是虛繼承其基類B,編譯器會為類A及其子類合并默認構造函數來初始化而定義偏移地址。
這里還加一條:
對于后面三點,如果類C中包含這樣的類A,同1一樣,編譯器會合并默認構造函數。