C Primer 複製控制

2021-06-18 07:43:13 字數 1944 閱讀 3303

複製建構函式:當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯式使用複製建構函式 a a = a();當將該型別的物件傳遞給函式或從函式返回該型別的物件時,將隱式使用複製建構函式(顯式使用和隱式使用的區別?)

析構函式:當物件超出作用域或動態分配的物件被刪除時,將自動應用析構函式。

複製建構函式,賦值操作符和析構函式總稱為複製控制。編譯器自動實現這些操作,但類也可以定義自己的版本。

1.只有單個形參,而且該形參是對本類型別物件的引用(常用const修飾),這樣的建構函式稱為複製建構函式。c++支援直接初始化(使用「()」)和複製初始化(使用「=」)兩種形式。直接初始化呼叫與實參匹配的建構函式,複製初始化則呼叫複製建構函式(注意:

classtest ct3 = ct1;複製初始化,

classtest ct4(ct1);直接初始化

注:都是呼叫複製建構函式,但是呼叫複製函式的原因卻有所不同。因為直接初始化是根據引數來呼叫建構函式的,如classtest ct4(ct1),它是根據括號中的引數(乙個本類的物件),來直接確定為呼叫複製建構函式classtest(const classtest& ct),這跟函式過載時,會根據函式呼叫時的引數來呼叫相應的函式是乙個道理;而對於ct3則不同,它的呼叫並不是像ct4時那樣,是根據引數來確定要呼叫複製建構函式的,它只是因為初始化必然要呼叫複製建構函式而已。

)。通常直接初始化和複製初始化僅在低級別優化上存在差異,然而對不支援複製的型別或者使用非explicit建構函式的時候,還是有本質的區別:

ifstream file1("filename");

ifstream file2  = "filename";

sales_item item = string("9-999-99999-9");

file1的初始化沒問題,file2使用複製初始化,但是由於不能複製io型別的物件,所以不能對那些型別的物件使用複製初始化。

如果sales_item有引數為string型別的建構函式且其型別宣告為非explicit(此時string("9-999-99999-9")將轉換為sales_item型別)時item的初始化是對的,否則初始化失敗。

2.初始化容器元素:vector svec(5);編譯器首先使用string的預設建構函式建立乙個臨時值初始化svec,然後使用複製建構函式將臨時值複製到svec的每個元素。

3.複製建構函式和建構函式一樣,如果顯示的定義,編譯器會合成預設的複製建構函式,對於只包含類型別成員或內建成員的類,合成的預設複製建構函式就可以了。但是有些類必須對複製物件時發生的事情加以控制,這樣的類經驗有乙個資料成員是指標或者有成員表示在建構函式中分配的其他資源(想象一下兩個buffer指標指向同一塊記憶體)。

4.禁止複製:有些模擬如io類不允許複製,為了防止複製,類必須宣告其複製建構函式為private(不定義複製建構函式的話,編譯會合成預設的複製建構函式)---如果複製建構函式是private,將不允許使用者**複製該類型別的物件。然後類的友元和成員仍然可以進行複製(友元和成員可以訪問類的private成員),如果想要連友元和成員中的複製也禁止,就可以宣告乙個private複製建構函式但不對其定義。使用者**中的複製嘗試在編譯時標記錯誤,而成員函式和友元中的複製嘗試將在鏈結時導致錯誤。

5.三法則:如果類需要析構函式,則它也需要賦值操作符和複製建構函式,析構函式與複製建構函式或賦值操作符之間的乙個重要區別是:即使編寫了自己的析構函式,合成析構函式仍然執行。

6.管理指標成員:包含指標的類要特別注意複製控制,原因是複製指標時只複製指標中的位址,而不會複製指標指向的物件。當兩個指標指向同一物件,可能使用任一指標改變基礎物件,很可能乙個指標刪除了以物件時,另一指標的使用者還認為基礎物件仍然存在並訪問,這會造成極大的風險,因此引入智慧型指標。

7.進一步理解直接初始化和複製初始化

c++的一大誤區——深入解釋直接初始化與複製初始化的區別

C Primer 複製控制

複製控制 當定義乙個新型別的時候,需要顯式或隱式地指定複製 賦值和撤銷該型別的物件時會發生什麼 這是通過定義特殊成員 複製建構函式 賦值操作符和析構函式來達到的。如果沒有顯式定義複製建構函式或賦值操作符,編譯器 通常 會為我們定義。複製建構函式 是一種特殊建構函式,具有單個形參,該形參 常用 con...

C Primer筆記 13 複製控制

當定義乙個新型別的時候,需要顯式或隱式地指定複製 賦值和撤銷該型別的物件時會發生什麼 這就是通過定義特殊成員 複製建構函式 賦值操作符和析構函式來達到的。如果沒有顯式定義複製建構函式或賦值操作符,編譯器會為我們定義。複製建構函式 賦值操作符和析構函式總稱為複製控制 copy constrol 編譯器...

C Primer 學習筆記 複製控制

複製建構函式 賦值操作符和析構函式總稱為複製控制。一.複製建構函式 1.複製建構函式用途 只有單個形參,而且該形參是對本類型別物件的引用 通常是const修飾 的建構函式,稱為複製建構函式,它通常可用於 1.根據另乙個同型別的物件顯示或隱式初始化乙個物件.string str1 100000 str...