構造 析構 賦值運算

2022-09-03 05:48:06 字數 2102 閱讀 8409

條款05:了解c++默默編寫並呼叫哪些函式

如果我們寫了乙個空類:

class empty ;

編譯器會為這個類新增一些default的函式,相當於:

class

empty

//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)。

class

uncopyable

~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 ...