大多數(shù)C++書籍都說在我們沒有自己定義構(gòu)造函數(shù)的時(shí)候,編譯器會(huì)自動(dòng)生成默認(rèn)構(gòu)造函數(shù)。其實(shí)這句話我一直也是
深信不疑。但是最近看了一些資料讓我有了一點(diǎn)新的認(rèn)識(shí)。
其實(shí)我覺得大多數(shù)C++書籍之所以這樣描述其實(shí)是玩了文字游戲的。如果說編譯器自動(dòng)產(chǎn)生的默認(rèn)構(gòu)造函數(shù)對(duì)于我們
的類沒有任何作用,也就是說在編譯器默認(rèn)生成的這個(gè)構(gòu)造函數(shù)里根本沒有任何實(shí)質(zhì)性的代碼工作,那么這種默認(rèn)構(gòu)
造其實(shí)是可有可無(wú)的,所以不妨說編譯器其實(shí)是為每個(gè)類生成了默認(rèn)構(gòu)造函數(shù)的。
在深度探索C++對(duì)象模型中講了四種關(guān)于編譯器自動(dòng)生成默認(rèn)構(gòu)造函數(shù)的情況,在這四種情況下生成的默認(rèn)構(gòu)
造函數(shù)里面是由實(shí)質(zhì)的隱含代碼操作的:
1、 如果類A成員中含有某個(gè)類B的對(duì)象,恰好類B也顯示定義了構(gòu)造函數(shù),那么在產(chǎn)生類A對(duì)象的時(shí)候編譯器會(huì)產(chǎn)生一個(gè)默認(rèn)構(gòu)造函數(shù),在這個(gè)默認(rèn)構(gòu)造函數(shù)中提供了調(diào)用類A構(gòu)造函數(shù)的代碼。
2、如果類B繼承于類A,且類A顯示定義了構(gòu)造函數(shù),那么在生成類B對(duì)象的過程中編譯器同樣會(huì)產(chǎn)生一個(gè)默認(rèn)構(gòu)造函數(shù),在這個(gè)構(gòu)造函數(shù)中提供調(diào)用基類A構(gòu)造函數(shù)的代碼。
3、如果某個(gè)類含有虛函數(shù),那么編譯器會(huì)自動(dòng)產(chǎn)生一個(gè)默認(rèn)構(gòu)造函數(shù)以提供虛表指針相關(guān)的初始化操作。
4、如果一個(gè)類虛繼承于其他類,那么同樣的編譯器會(huì)為該類產(chǎn)生默認(rèn)的構(gòu)造函數(shù)。
除以上四種情況,編譯器都不產(chǎn)生默認(rèn)構(gòu)造函數(shù),因?yàn)榫退憔幾g器產(chǎn)生了默認(rèn)構(gòu)造函數(shù),然而在該默認(rèn)構(gòu)造函數(shù)中沒有實(shí)質(zhì)的內(nèi)容,那么這個(gè)默認(rèn)構(gòu)造函數(shù)也就是沒存在的意義的,那么我們說編譯器不產(chǎn)生也無(wú)妨吧。
以上就是小編為大家?guī)淼膶?duì)C++默認(rèn)構(gòu)造函數(shù)的一點(diǎn)重要說明全部?jī)?nèi)容了,希望大家多多支持武林網(wǎng)~
新聞熱點(diǎn)
疑難解答