c primer 學習筆記24 複製建構函式

2021-07-11 11:23:06 字數 1406 閱讀 5408

複製建構函式是一種特殊建構函式,具有單個形參,該形參(常用 const 修飾)是對該類型別的引用。當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯式使用複製建構函式。當將該型別的物件傳遞給函式或函式返回該型別的物件時,將隱式使用複製建構函式。

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

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

通常,編譯器合成的複製控制函式是非常精練的——它們只做必需的工作。但對某些類而言,依賴於預設定義會導致災難。實現複製控制操作最困難的部分,往往在於識別何時需要覆蓋預設版本。有一種特別常見的情況需要類定義自己的複製控制成員的:類具有指標成員。

複製建構函式

只有單個形參,而且該形參是對本類型別物件的引用(常用 const 修飾),這樣的建構函式稱為複製建構函式。與預設建構函式一樣,複製建構函式可由編譯器隱式呼叫。複製建構函式可用於:

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

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

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

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

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

形參與返回值

正如我們所知,當形參為非引用型別(第 7.2.1 節)的時候,將複製實參的值。類似地,以非引用型別作返回值時,將返回 return 語句 中的值的副本。 當形參或返回值為類型別時,由複製建構函式進行複製。

禁止複製

有些類需要完全禁止複製。例如,iostream 類就不允許複製。如果想要禁止複製,似乎可以省略複製建構函式,然而,如果不定義複製建構函式,編譯器將合成乙個。

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

如果複製建構函式是私有的,將不允許使用者**複製該類型別的物件,編譯器將拒絕任何進行複製的嘗試。

然而,類的友元和成員仍可以進行複製。如果想要連友元和成員中的複製也禁止,就可以宣告乙個(private)複製建構函式但不對其定義。

大多數類應定義複製建構函式和預設建構函式

不定義複製建構函式和/或缺省建構函式,會嚴重侷限類的使用。不允許複製的類物件只能作為引用傳遞給函式或從函式返回,它們也不能用作容器的元素。

一般來說,最好顯式或隱式定義預設建構函式和複製建構函式。只有不存在其他建構函式時才合成預設建構函式。如果定義了複製建構函式,也必須定義預設建構函式。

C Primer 學習筆記 複製控制

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

C Primer筆記 13 複製控制

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

C Primer筆記之複製控制

複製控制這一節需要注意的地方不多,主要有以下幾點 1 定義自己的複製建構函式 什麼時候需要定義自己的複製建構函式,而不用系統提供的,主要遵循以下的經驗說明 某些類必須對複製物件時發生的事情加以控制,這樣的類 1 經常有乙個資料成員是指標,2 有成員在建構函式中分配的其他資源 而另一些類在建立物件時必...