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