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