拷貝控制操作:定義類的時候, 顯示或隱式指定了在此型別物件拷貝,移動,賦值和銷毀時做了什麼。拷貝建構函式和移動建構函式定義了當同型別的另乙個物件初始化本物件做了什麼。移動和拷貝賦值運算子定義了當同型別的另乙個物件賦予給本物件做了什麼。析構函式定義此型別物件銷毀做了什麼。
如果乙個類沒有定義所有這些拷貝控制成員,那麼編譯器自動新增預設的操作。但是如果我們不定義這些操作,編譯器幫助我們定義,但是編譯器定義的可能並不是我們想要的操作。
class
string
定義的時候賦值叫做初始化,以後賦值叫做拷貝賦值運算子。如果類未定義自己的拷貝賦值運算子,編譯器也自動合成乙個。
class foo
sale_data a , b;
a = b;//使用拷貝賦值運算子
sale_data& sale_data::operator=(sale_data &a)//等價於合成拷貝賦值運算子
建構函式初始化物件每乙個非static資料成員,還可能做做其他工作因為有函式體;析構函式釋放物件使用資源,並銷毀物件的非static資料成語。波浪號接類名組成。沒有返回值也不接受引數,所以不可被過載。
class foo
//退出區域性作用域;編譯器自動呼叫item、p2和vec呼叫析構函式。
/*我們只需直接釋放繫結到p的動態分配物件。其他sale_data會離開作用域自行銷毀。
item、p2和vec離開作用域時候會呼叫(編譯器自動加入)對應的析構函式。vector析構函式會銷毀新增的vec元素。
shared_ptr會遞減p2的引用計數。
所有sale_data的析構函式隱式銷毀bookno成員,銷毀bookno成員會呼叫string析構函式,會釋放用來儲存isbn的記憶體。
當指向乙個物件的引用或指標離開時候,析構函式不會執行,因為內建型別沒有析構函式,僅僅通過棧進行管理釋放區域性變數而已。
*/
//等價的合成析構函式
class foo//合成的析構函式,成員自動銷毀,不做其他事情。
}
需要析構函式也需要拷貝和賦值函式。最好就是前面說的三個函式都定義起來,否則可能出現記憶體管理上面的問題。這是一些簡單的邏輯,沒事看看這個書本,就會明白這個道理。
大多數情況定義拷貝函式和賦值運算子有合理的意義,但是某些類擁有這些操作沒有什麼意義,也就是需要機制阻止拷貝或賦值。用來阻止編譯器合成。
class
nocopy
13章,拷貝控制
ex1 1,拷貝建構函式的定義 乙個建構函式的第乙個引數是自身型別的引用,且任何額外引數都有預設值。2,出現場合 ex2 拷貝建構函式自己的引數必須是引用型別。因為如果不是的話,在呼叫拷貝建構函式時,將乙個物件作為實參傳遞給乙個非引用型別的形參時,會再次呼叫該拷貝建構函式陷入死迴圈。ex5haspt...
第13章 拷貝控制
拷貝建構函式class foo sales data sales data const sales data orig bookno orig.bookno units sold orig.units sold revenue orig.revenue 拷貝賦值運算子foo operator con...
第13章 拷貝控制
拷貝構造的第乙個引數是自身類型別的引用,且任何額外引數都有預設值,成為拷貝建構函式。拷貝建構函式通常不應該是explicit,可以接受非const引用。class foo 合成拷貝建構函式 編譯器會自動合成拷貝建構函式。一般情況中,合成的拷貝建構函式會將其引數的成員逐個拷貝到正在建立的物件中。編譯器...