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