條款05:了解c++默默編寫並呼叫哪些函式
如果我們寫了乙個空類:
class empty ;
編譯器會為這個類新增一些default的函式,相當於:
classempty
//default建構函式
empty(const empty& rhs) //
copy建構函式
~empty() //
析構函式
empty & operator=(const empty& rhs) //
copy assigment操作符
};
其中,編譯器建立的copy建構函式和copy assigment操作符只是單純地將**物件的每乙個non-static成員變數拷貝到目標變數。編譯器建立的copy assigment操作符與copy建構函式行為上基本相同,但一般只有生成的**合法而且有適當機會證明它有意義時,編譯器才會建立copy assigment操作符。例如類中有const或者引用的字段時,往往編譯器會拒絕建立copy assigment操作符。
如果我們為類宣告了建構函式,則編譯器不再給類新增default建構函式。
條款6:若不想使用編譯器自動生成的函式,就應該明確拒絕
如果不想使用default建構函式和析構函式,我們可以通過宣告建構函式和析構函式來拒絕。
但是如果不想使用copy建構函式和copy assigment操作符,例如,我們不允許一下操作:
object a1;object a2;
object a3(a1);
//不允許該操作
object a2 = a1; //
不允許該操作
如何才能拒絕上面兩種情況呢?
一種方法是將copy建構函式和copy assigment操作符宣告為private,這樣外部就無法呼叫到這兩個方法,編譯器也不會自己新增。但是使用者member函式或friend函式還是有可能呼叫到這兩個方法,所以我們可以只宣告這兩個方法而不實現,如果不慎呼叫到,會獲得乙個連線錯誤(link error)。
classuncopyable
~uncopyable () {}
private
: uncopyable(
const uncopyable&);
uncopyable& operator=(const uncopyable&);
};//
其他類只需要繼承uncopyable即可
class newclass : private
uncopyable ;
條款7:為多型基類宣告virtual析構函式
條款8:別讓異常逃出析構函式
條款9:絕不要在建構函式中呼叫virtual函式
條款10:令operator=返回乙個reference to *this
可以實現連鎖複製,如 a = b = c;
這個條款同樣適用於 operator+=,-=,*=,/=等等。
條款11:在operator=中處理「自我賦值」
例如:
widget& widget::operator=(const widghet&rhs)
另外一種處理自我賦值的方法:
//copy and swap
widget& widget::operator=(const widghet&rhs)
條款12:複製物件時勿忘其每乙個成分
必須確保:1.複製所有local成員變數;2.呼叫所有base classes內適當的copying函式。
構造 析構 賦值運算
非內建資料型別 一般而言,只有當生出的 合法且有適當機會證明它有意義,編譯器才會為class 生出operator 建構函式 析構函式 stl 或標準庫或已經存在的,不包含虛函式的類,我們不應該繼承它們 比較好的一種辦法是,自己在析構函式中,可以選擇,記錄並退出,或者記錄並繼續執行。但同時提供乙個p...
C 構造 析構 賦值運算
有時候,某個物件是獨一無二的,不能沒複製也不能被賦值!所以我們要強制編譯器不允許使用 和copy 建構函式,但如果你不寫他們,編譯器又會自動幫你加上,問題由此引發。class home uncopyable private uncopyable const uncopyable uncopyable...
二 構造 析構 賦值運算
c 編譯器會宣告編譯器版本的copy建構函式,乙個copy assignment操作符和乙個析構函式,此外若沒有宣告乙個建構函式,則還會宣告乙個預設建構函式。這些函式都是public且inline的。copy建構函式和copy assignment操作符,編譯器版本只是單純地將 物件的每乙個non ...