Effective C++ 第五條 Know what functions C++ silently writes and ca
當(dāng)你創(chuàng)建一個(gè)類(哪怕是空類),C++會(huì)為你創(chuàng)建三個(gè)默認(rèn)函數(shù),構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、析構(gòu)函數(shù),這些函數(shù)都是public且inline的,只有當(dāng)這些函數(shù)被調(diào)用才會(huì)被編譯器創(chuàng)建出來。
這里有個(gè)要點(diǎn)需要注意,編譯器自動(dòng)產(chǎn)生的拷貝構(gòu)造函數(shù)可能會(huì)引發(fā)內(nèi)存泄漏(深拷貝淺拷貝),例子如下

如果按照這些執(zhí)行,代碼會(huì)報(bào)錯(cuò),原因是編譯器的默認(rèn)拷貝構(gòu)造函數(shù)是淺拷貝,也就是a2中的p并不是獨(dú)立于a1中的p,而是a1.p和a2.p指向同一個(gè)位置,當(dāng)這個(gè)位置被a1的析構(gòu)函數(shù)釋放掉之后,這塊內(nèi)存也就被釋放了,但是a2.p仍然指向這個(gè)位置,這就導(dǎo)致a2的析構(gòu)函數(shù)會(huì)再一次釋放這一塊內(nèi)存,從而導(dǎo)致錯(cuò)誤。解決方案應(yīng)該如下

有的時(shí)候我們不希望有些對(duì)象被拷貝,比如有一個(gè)類是人(Person),我們聲明一個(gè)p,但是我們知道世界上不可能有兩個(gè)一摸一樣的人,所以不允許對(duì)p進(jìn)行拷貝構(gòu)造,這個(gè)時(shí)候我們需要手動(dòng)的將拷貝構(gòu)造函數(shù)在private下聲明,這樣就不允許外部顯式的調(diào)用拷貝構(gòu)造函數(shù),從而不能進(jìn)行拷貝。

但謹(jǐn)記,不要將構(gòu)造函數(shù)和析構(gòu)函數(shù)放入private下,這樣會(huì)導(dǎo)致類無法創(chuàng)建或者創(chuàng)建后出錯(cuò)。