這一篇博客是《Effective C++》中第5個條款考廉。但現(xiàn)在感覺我還沒太理解它到底說了什么上忍,所以想寫寫博客,萬一寫著寫著就明白了呢酱吝。
首先在這里敘述一個機制也殖,那就是空類,在默認的情況下务热,編譯器會給它自動生成默認的構(gòu)造函數(shù)忆嗜、拷貝構(gòu)造函數(shù)、拷貝賦值操作符=和析構(gòu)函數(shù)崎岂。并且他們都是public的和inline的捆毫。
它與下面這個類是一樣的。
至于這些成員函數(shù)和操作符是干啥用的该镣,我在前邊的博文中闡述過了冻璃。
其中响谓,默認的構(gòu)造函數(shù)負責(zé)調(diào)用父類和非static的構(gòu)造函數(shù)和析構(gòu)函數(shù)损合。如上圖可見編譯器自動生成的析構(gòu)函數(shù)是非virtual的省艳,如果父類中本身存在virtual的析構(gòu)函數(shù),編譯器就不會自動產(chǎn)生非virtual的析構(gòu)函數(shù)了嫁审。而默認的copy構(gòu)造函數(shù)和copy賦值操作符只是copy非static成員到目標(biāo)對象跋炕。
不過,如果你手動寫了它們中的一些律适,編譯器就只會自動生成你沒寫的辐烂。比如你只寫了構(gòu)造函數(shù),那么其他的東西編譯器負責(zé)給你自動生成捂贿。至于說copy構(gòu)造函數(shù)和copy賦值操作符的用法我以前的博文有提到過纠修。
而copy構(gòu)造函數(shù)總是層層調(diào)用底層的copy構(gòu)造函數(shù)來進行賦值,比如說copy構(gòu)造函數(shù)要copy一個string類型的變量厂僧,那么它就會調(diào)用string的copy構(gòu)造函數(shù)扣草,實在沒辦法了,它再自己進行賦值操作颜屠。
其實本原則著重討論的是在什么情況下編譯器不會自動生成這些東東辰妙。
對于默認的構(gòu)造函數(shù)而言,當(dāng)你手動寫了一個構(gòu)造函數(shù)的話甫窟,編譯器就不會再費那個勁了密浑。
而對于copy賦值操作符呢也是有自動生成條件的,那就是這個copy賦值操作符確實有存在的意義粗井,并且它能在使用場合能正確工作尔破,否則除非你自己手動寫一個,要不然編譯器是不會給你生成這些東東的浇衬。而在書中作者舉了2個例子1個是引用呆瞻,另一個是const常量,這兩者所指的對象都是不能更改的径玖,那你非要給它們賦值痴脾,那肯定會導(dǎo)致copy賦值操作符的失敗。
書中還舉個1個例子梳星,一般情況下父類中如果有copy賦值操作符赞赖,在子類中編譯器是不會再給自動生成copy賦值操作符,直接使用父類的就好了冤灾,因為編譯器認為子類的copy賦值操作符是要能夠處理父類的賦值操作的前域。所以如果你此時把父類的copy賦值操作符設(shè)置為private的,那么你就沒有copy賦值操作符可用了韵吨,除非你自己在子類中寫一個匿垄。