18 C Primer 4th 筆記,複製控制

2022-02-12 11:22:58 字數 1886 閱讀 4506

1、顯式建構函式

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

修飾)是對該類型別的引用

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

編譯器自動執行類中非static

資料成員的析構函式。

2、賦值操作符可以通過指定不同型別的右運算元而過載

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

4、c++

支援兩種初始化形式:直接初始化和複製初始化。複製初始化使用

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

當用於類型別物件時,初始化的複製形式和直接形式有所不同:

直接初始化直接呼叫與實參匹配的建構函式,複製初始化總是呼叫複製建構函式。

複製初始化首先使用指定建構函式建立乙個臨時物件,然後用複製建構函式將那個臨時物件複製到正在建立的物件:

示例

string null_book = "00000"; //拷貝建構函式

string dotc(10, '.'); //直接初始化

string empty_copy = string(); //拷貝建構函式

string empty_direct; //直接初始化

5、以非引用型別作為返回值時,將返回

return

語句中的值的副本。

6、合成的複製建構函式

如果我們沒有定義複製建構函式,編譯器就會為我們合成乙個。合成複製建構函式的行為是,執行逐個成員初始化,將新物件初始化為原物件的副本。

所謂「逐個成員」,

指的是編譯器將現在物件的每個非 static

成員,依次複製到正建立的物件。

只有乙個例外,每個成員的型別決定了複製該成員的含義。合成複製建構函式直接複製內建型別成員的值,類型別成員使用該類的複製建構函式進行複製。陣列成員的複製是個例外。雖然一般不能複製陣列,但如果乙個類具有陣列成員,則合成複製建構函式將複製陣列。複製陣列時合成複製建構函式將複製陣列的每乙個元素。

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

不允許複製的類物件只能作為引用傳遞給函式或從函式返回,它們也不能用作容器的元素。

只有不存在其他建構函式時才合成預設建構函式。

8、內建型別的賦值運算返回對左運算元的引用。

示例

class sales_item

};

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

10、析構函式

當物件的引用或指標超出作用域時,不會執行析構函式。只有刪除指向動態分配物件的指標或實際物件(不是物件的引用)超出作用域時,才會執行析構函式。

如果類需要析構函式,則它也需要賦值操作和複製建構函式,這是乙個有用的經驗法則(通常稱為三法則)。

11、與複製建構函式或賦值操作符不同,編譯器總是會我們合成乙個析構函式。

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

成員。合成析構函式並不刪除指標成員所指向的物件。

12、析構函式沒有形參,不能過載。

即使我們編寫了自己的析構函式,合成析構函式仍然執行。

(先執行自定義的,再執行合成的

)13、

析構函式對撤銷內建型別或指標型別的成員沒有影響。賦值操作必須是類的成員並且必須返回對類物件的引用。

關於複製建構函式中涉及的深拷貝,淺拷貝,及與賦值操作的異同,可以參見下列文章。

參考[1]

[2]

[3]

[4]

[5]

[6]

29 C Primer 4th 筆記,異常處理

1 類成員的指標不同於指向普通資料或函式的指標,普通指標只根據物件或函式的型別而變化,而成員的指標必須反映成員所屬的類。2 異常是通過丟擲物件而引發的。該物件的型別決定應該啟用哪個處理 被選中的處理 是呼叫鏈中與該物件型別匹配且離丟擲異常位置最近的那個。異常以類似於將實參傳遞給函式的方式丟擲和捕獲。...

C Primer 5th學習筆記4 異常語句

c 語言中,異常處理包括以下幾種 try語句的通用語法形式是 try catch exception declaration catch exception declaration c 標準庫中定義了一組類,用於報告標準庫函式遇到的問題。這些類分別定義在以下四個標頭檔案中 exception 最常見...

c primer 4th中習題4 8的答案

比較兩個vector是否相等的 當輸入兩組相同的數時就會出現異常 問題就出在這裡,當輸入的 ivec1 和 ivec2 的內容相等時,比如都是 1 2 3 時,在執行到 while 迴圈時,比較 ivec1 和 ivec2 的對應數值是否相等,如果相等的話,則迭代器 iter1 和 iter2 都做...