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 都做...