第13章 複製控制 1

2022-09-23 08:12:14 字數 1612 閱讀 1047

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

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

賦值操作符(assignment operator)可以通過指定不同型別的右運算元而過載。右運算元為類型別的版本比較特殊:如果我們沒有編寫這種版本,編譯器將為我們合成乙個。

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

有一種特殊常見的情況需要類定義自己的複製控制成員的:類具有指標成員。

13.1 複製建構函式

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

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

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

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

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

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

1. 物件的定義形式

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

當用於類型別物件時,初始化的複製形式和直接形式有所不同:直接初始化直接呼叫與實參匹配的建構函式,複製初始化總是呼叫複製建構函式。複製初始化首先使用指定建構函式建立乙個臨時物件,然後用複製建構函式將那個臨時物件複製到正在建立的物件。

staticclass cs1(); 

staticclass cs2 = staticclass(); 

對於類型別物件,只有指定單個實參或顯式建立乙個臨時物件用於複製時,才使用複製初始化。

由於不能複製io型別的物件,所以不能對那些型別的物件使用複製初始化。

2. 形參與返回值

當形參為非引用型別的時候,將複製實參的值。類似地,以非引用型別做返回值時,將返回return語句中的值的副本。

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

3. 初始化容器元素

複製建構函式可用於初始化順序容器中的元素。例如,可以用表示容量的單個形參來初始化容器。容器的這種構造方式使用了預設建構函式和複製建構函式。

vector vec(5); 

作為一般規則,除非你想使用容器元素的預設初始值,更有效的辦法是,分配乙個空容器並將已知元素的值加入容器。

4. 建構函式和陣列元素

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

class class5 

}; class5 arr[4] = ; 

摘自 xufei96的專欄

第13章 複製控制

複製建構函式 賦值操作符和析構函式總稱為複製控制 copy control 複製建構函式可用於 1 根據另乙個同型別的物件顯式或隱式初始化乙個物件 2 複製乙個物件,將它作為實參傳給乙個函式 3 從函式返回時複製乙個物件 4 初始化順序容器中的元素,如vectorsev 5 分別用了預設建構函式和複...

第13章 複製控制 4

13.3 析構函式 析構函式可以完成資源 作為類建構函式的補充。1.何時呼叫析構函式 撤銷類物件時會自動呼叫析構函式。變數在超出作用域時應該自動撤銷。動態分配的物件只有在指向該物件的指標被刪除時才撤銷。如果沒有刪除指向動態物件的指標,則不會執行該物件的析構函式,物件就一直存在,從而導致記憶體洩漏,而...

第13章習題 複製控制

1.理解呼叫過程 include include using namespace std 定義exmpl類,該類給出複製控制成員和乙個預設建構函式,各成員函式輸出自己的名字。主程式中以不同方式使用exmpl型別的物件 作為非引用形參和引用形參傳遞,動態分配 作為函式返回值,進行賦值操作 作為元素放在...