編譯器可以暗自為class建立預設建構函式、拷貝建構函式(初始化呼叫)、拷貝賦值操作符(賦值呼叫)、析構函式·
類名(
)~類名(
)類名&
operator=(
const 類名& rhs)
為了阻止編譯器自動生產函式:自行宣告函式
為了防止別人呼叫:宣告為private
為了防止友元函式和成員函式呼叫:只定義不實現
為駁回編譯器自動提供的機能,可將相應的成員函式宣告為private並且不予實現
原因:析構函式吐出異常,會使程式過早結束或出現不明確的行為。比如:銷毀十個成員物件,在銷毀第乙個的時候出現異常,這會使後面的成員物件沒有被銷毀就退出程式了。
當基類在構造函式呼叫純虛函式,在建立派生類物件時,會先呼叫基類的建構函式,由於基類構造函式呼叫了純虛函式,同時又因基類構造期間virtual函式不會下降到派生類階層(基類構造期間,virtual不是virtual),基類函式沒有實現,進而導致派生類物件無法建立。(可能回報錯:找不到函式的實現**)。
...
類名&operator=(
const 類名& rhs)
例子:pa和pb是指向同乙個物件的指標,有如下語句:
pa = pb;
//賦值函式
operator=(
const ***& rhs)
operator=中一般會先刪除自己的成員物件(如果有),使用傳入的物件(別名)建立乙個相同的物件,賦給該類的成員物件變數,然後返回this。發現自己持有乙個指標指向乙個已被刪除的物件。
解決方法:
1.證同測試-判斷是否是自我賦值,如果是直接返回this
缺陷:如果建立成員物件中new異常,之前的成員也被刪除了,又沒建立成功,這樣的指標有問題。
2.先建立物件,再刪除
缺陷:自我賦值的效率問題,如果將證同測試加進來,會增加新的控制分支,**也會變長,也會降低執行速度。
3.copy and swap-先複製副本,再將this和副本交換。
當基類中添成員物件時,必須同時修改拷貝函式(拷貝函式和拷貝賦值函式),發生繼承,一定在派生類拷貝建構函式後加上:baseclass(rhs)呼叫父類的建構函式;拷貝賦值函式體裡加上baseclass::operator=(rhs)。
C 構造 析構 賦值運算
有時候,某個物件是獨一無二的,不能沒複製也不能被賦值!所以我們要強制編譯器不允許使用 和copy 建構函式,但如果你不寫他們,編譯器又會自動幫你加上,問題由此引發。class home uncopyable private uncopyable const uncopyable uncopyable...
c 構造 析構 賦值 運算
1 為多型基類宣告virtual析構函式 帶有多型形態的base classs應該宣告乙個virtual析構函式。如果該class帶有任何virtual的函式,它就應該擁有乙個virtual析構函式。這樣用基類指標指向的派生類的析構的時候,才會呼叫到自己的析構函式,將派生類的所有部分都析構掉,否則只...
構造 析構 賦值運算
非內建資料型別 一般而言,只有當生出的 合法且有適當機會證明它有意義,編譯器才會為class 生出operator 建構函式 析構函式 stl 或標準庫或已經存在的,不包含虛函式的類,我們不應該繼承它們 比較好的一種辦法是,自己在析構函式中,可以選擇,記錄並退出,或者記錄並繼續執行。但同時提供乙個p...