c primer 3 12 複製建構函式

2021-08-26 18:46:38 字數 1829 閱讀 5170

c++ 支援兩種初始化形式):直接初始化和複製初始化。複製初始化使用 = 符號,而直接初始化將初始化式放在圓括號中。

當形參或返回值為類型別時,由複製建構函式進行複製

string make_plural(size_t, const string&, const string&);

這個函式隱式使用 string 複製建構函式返回給定單詞的複數形式。形參是 const 引用,不能複製。

複製建構函式可用於初始化順序容器中的元素。

vectorsvec(5);

編譯器首先使用 string 預設建構函式建立乙個臨時值來初始化 svec,然後使用複製建構函式將臨時值複製到svec 的每個元素。

如果沒有為類型別陣列提供元素初始化式,則將用預設建構函式初始化每個元素。然而,如果使用常規的花括號括住的陣列初始化列表(第 4.1.1 節)來提供顯式元素初始化式,則使用複製初始化來初始化每個元素。根據指定值建立適當型別的元素,然後用複製建構函式將該值複製到相應元素:

sales_item primer_eds = ;

如果我們沒有定義複製建構函式,編譯器就會為我們合成乙個。與合成的預設建構函式(第 12.4.3 節)不同,即使我們定義了其他建構函式,也會合成複製建構函式。合成複製建構函式的行為是,執行逐個成員初始化,將新物件初始化為原物件的副本。

所謂「逐個成員」,指的是編譯器將現在物件的每個非 static 成員,依次複製到正建立的物件。只有乙個例外,每個成員摟型別決定了複製該成員的含義。合成複製建構函式直接複製內建型別成員的值,類型別成員使用該類的複製建構函式進行複製。陣列成員的複製是個例外。雖然一般不能複製陣列,但如果乙個類具有陣列成員,則合成複製建構函式將複製陣列。複製陣列時合成複製建構函式將複製陣列的每乙個元素。

制建構函式就是接受單個類型別引用形參(通常用 const 修飾)的建構函式:

class foo ;

無須顯式地定義複製建構函式,也可以複製。

然而,有些類必須對複製物件時發生的事情加以控制。這樣的類經常有乙個資料成員是指標,或者有成員表示在建構函式中分配的其他資源。而另一些類在建立新物件時必須做一些特定工作。這兩種情況下,都必須定義複製建構函式。

為了防止複製,類必須顯式宣告其複製建構函式為 private。

與複製建構函式一樣,如果類沒有定義自己的賦值操作符,則編譯器會合成乙個。

例如,sales_item 的賦值操作符可以宣告為:

class sales_item ;

合成賦值操作符與合成複製建構函式的操作類似。它會執行逐個成員賦值:右運算元物件的每個成員賦值給左運算元物件的對應成員。除陣列之外,每個成員用所屬型別的常規方式進行賦值。對於陣列,給每個陣列元素賦值。

as an example, the synthesized sales_item assignment operator would look something like:

例如,sales_item 的合成賦值操作符可能如下所示:

// equivalent to the synthesized assignment operator

sales_item&

sales_item::operator=(const sales_item &rhs)

可以使用合成複製建構函式的類通常也可以使用合成賦值操作符。我們的

sales_item 類無須定義複製建構函式或賦值操作符,而,類也可以定義自己的賦值操作符。一般而言,如果類需要複製建構函式,它也會需要賦值操作符。

C Primer複製控制 13 3 析構函式

如果類需要析構函式,則它也需要賦值操作符和複製建構函式,這是乙個有用的經驗法則。這個規則常稱為 三法則,指的是如果需要析構函式,則需要所有這三個複製控制成員。複製建構函式或賦值操作符不同,編譯器總是會為我們合成乙個析構函式。合成析構函式按物件建立時的逆序撤銷每個非static 成員,因此,它按成員在...

C Primer 複製控制

複製建構函式 當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯式使用複製建構函式 a a a 當將該型別的物件傳遞給函式或從函式返回該型別的物件時,將隱式使用複製建構函式 顯式使用和隱式使用的區別?析構函式 當物件超出作用域或動態分配的物件被刪除時,將自動應用析構函式。複製建構函式,賦值操...

C Primer 複製控制

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