當定義乙個新型別的時候,需要顯式或隱式地指定複製、賦值和撤銷該型別的物件時會發生什麼--這就是通過定義特殊成員:複製建構函式、賦值操作符和析構函式來達到的。如果沒有顯式定義複製建構函式或賦值操作符,編譯器會為我們定義。
複製建構函式、賦值操作符和析構函式總稱為複製控制(copy constrol)。編譯器自動實現這引起操作,但類也可以定義自已的版本。
有一種特別常見的情況需要類定義自已的複製控制成員的:類具有指標成員。
關鍵字: cpp
只有單個形參,而且該形參是對本類型別物件的引用(常用 const 修飾),這樣的建構函式稱為複製
建構函式
複製建構函式可用於:
1. 根據另乙個同型別的物件顯式或隱式初始化乙個物件
2. 複製乙個物件,將它作為實參傳給乙個函式
3. 從函式返回時複製乙個物件
4. 初始化順序容器中的元素
5. 根據元素初始化式列表初始化陣列元素
當用於類型別物件時,初始化的複製形式和直接形式有所不同:直接初始化直接呼叫與實參匹配的構
造函式,複製初始化總是呼叫複製建構函式
對於類型別物件,只有指定單個實參或顯式建立乙個臨時物件用於複製時,才使用複製初始化
當形參或返回值為類型別時,由複製建構函式進行複製
如果沒有為類型別陣列提供元素初始化式,則將用預設建構函式初始化每個元素
如果我們沒有定義複製建構函式,編譯器就會為我們合成乙個
與合成的預設建構函式不同,即使我們定義了其他建構函式,也會合成複製建構函式
合成複製建構函式的行為是,執行逐個成員初始化,將新物件初始化為原物件的副本
雖然一般不能複製陣列,但如果乙個類具有陣列成員,則合成複製建構函式將複製陣列,複製陣列時
合成複製建構函式將複製陣列的每乙個元素
逐個成員初始化最簡單的概念模型是,將合成複製建構函式看作這樣乙個建構函式:其中每個資料成
員在建構函式初始化列表中進行初始化
雖然也可以定義接受非 const 引用的複製建構函式,但形參通常是乙個 const 引用
因為用於向函式傳遞物件和從函式返回物件,該建構函式一般不應設定為 explicit
有些類必須對複製物件時發生的事情加以控制,這樣的類經常有乙個資料成員是指標,或者有成員表
示在建構函式中分配的其他資源,而另一些類在建立新物件時必須做一些特定工作,這兩種情況下,
都必須定義複製建構函式
為了防止複製,類必須顯式宣告其複製建構函式為 private
類的友元和成員仍可以進行複製,如果想要連友元和成員中的複製也禁止,就可以宣告乙個
(private)複製建構函式但不對其定義
一般來說,最好顯式或隱式定義預設建構函式和複製建構函式,只有不存在其他建構函式時才合成默
認建構函式。如果定義了複製建構函式,也必須定義預設建構函式
C Primer 學習筆記 複製控制
複製建構函式 賦值操作符和析構函式總稱為複製控制。一.複製建構函式 1.複製建構函式用途 只有單個形參,而且該形參是對本類型別物件的引用 通常是const修飾 的建構函式,稱為複製建構函式,它通常可用於 1.根據另乙個同型別的物件顯示或隱式初始化乙個物件.string str1 100000 str...
C Primer筆記之複製控制
複製控制這一節需要注意的地方不多,主要有以下幾點 1 定義自己的複製建構函式 什麼時候需要定義自己的複製建構函式,而不用系統提供的,主要遵循以下的經驗說明 某些類必須對複製物件時發生的事情加以控制,這樣的類 1 經常有乙個資料成員是指標,2 有成員在建構函式中分配的其他資源 而另一些類在建立物件時必...
C Primer 複製控制
複製建構函式 當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯式使用複製建構函式 a a a 當將該型別的物件傳遞給函式或從函式返回該型別的物件時,將隱式使用複製建構函式 顯式使用和隱式使用的區別?析構函式 當物件超出作用域或動態分配的物件被刪除時,將自動應用析構函式。複製建構函式,賦值操...