C Primer 複製控制

2021-06-22 09:09:46 字數 1976 閱讀 4078

複製控制:

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

複製建構函式

是一種特殊建構函式,具有單個形參,該形參(常用

const

修飾)是對該類型別的引用。當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯式使用複製建構函式。當將該型別的物件傳遞給函式或函式返回該型別的物件時,將隱式使用複製建構函式。

析構函式

是建構函式的互補:當物件超出作用域或動態分配的物件被刪除時,將自動應用析構函式。析構函式可用於釋放物件時構造或在物件的生命期中所獲取的資源。不管類是否定義了自己的析構函式,編譯器都自動執行類中非

static

資料成員的析構函式

。實現複製控制操作最困難的部分,往往在於識別何時需要覆蓋預設版本。有一種特別常見的情況需要類定義自己的複製控制成員的:類具有指標成員

。複製建構函式可用於:

根據另乙個同型別的物件顯式或隱式初始化乙個物件。 •

複製乙個物件,將它作為實參傳給乙個函式。 •

從函式返回時複製乙個物件。 •

初始化順序容器中的元素。 •

根據元素初始化式列表初始化陣列元素。

複製初始化使用

= 符號,而直接初始化將初始化式放在圓括號中。

如果使用常規的花括號括住的陣列初始化列表(第

4.1.1

節)來提供顯式元素初始化式,則使用複製初始化來初始化每個元素

。sales_item primer_eds = ;

禁止複製:

有些類需要完全禁止複製。例如,

iostream

類就不允許複製(第

8.1

節)。如果想要禁止複製,似乎可以省略複製建構函式,然而,如果不定義複製建構函式,編譯器將合成乙個。

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

private

。如果複製建構函式是私有的,將不允許使用者**複製該類型別的物件,編譯器將拒絕任何進行複製的嘗試。然而,類的友元和成員仍可以進行複製。如果想要連友元和成員中的複製也

禁止,就可以宣告乙個(

private

)複製建構函式但不對其定義。

宣告而不定義成員函式是合法的。

合成賦值操作符

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

例如,sales_item

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

// equivalent to the synthesized assignment operator

sales_item&

sales_item::operator=(const sales_item &rhs)

動態分配的物件只有在指向該物件的指標被刪除時才撤銷

。如果沒有刪除指向動態物件的指標,則不會執行該物件的析構函式,物件就一直存在,從而導致記憶體洩漏,而且,物件內部使用的任何資源也不會釋放。當物件的引用或指標超出作用域時,不會執行析構函式。只有

刪除指向動態分配物件的指標或實際物件(而不是物件的引用)

超出作用域時,才會執行析構函式。

何時編寫顯式析構函式

:僅在有些工作需要析構函式完成時,才需要析構函式。析構函式通常用於釋放在建構函式或在物件生命期內獲取的資源。如果類需要析構函式,則它也需要賦值操作符和複製構造函

數,這是乙個有用的經驗法則。這個規則常稱為三法則,指的是如果需要析構函式,則需要所有這三個複製控制成員。

合成析構函式按物件建立時的逆序撤銷每個非

static

成員,因此,它按成員在類中宣告次序的逆序撤銷成員。

析構函式與複製建構函式或賦值操作符之間的乙個重要區別是,即使我們編寫了自己的析構函式,合成析構函式仍然執行。

C Primer 複製控制

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

C Primer筆記 13 複製控制

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

C Primer 學習筆記 複製控制

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