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