記錄下目前理解到的複製控制,析構函式。還有好多不理解的。。。。
一、複製建構函式(拷貝建構函式):是種特殊的建構函式,形參是對該類型別的引用,用const修飾。
1.1三種情況下使用複製建構函式。定義乙個新物件並用乙個同型別的物件對其進行初始化式,顯示使用複製建構函式;該型別物件作為函式引數時,隱式呼叫;作為函式返回值時,隱式呼叫。
1.2如果我們自己沒有顯示定義,編譯器會為我們生成乙個,該函式將對成員變數進行拷貝---淺拷貝,將現有物件的每個非static成員,依次複製到正在建立的物件。對於內建型別成員直接複製,對於類型別使用該類的複製建構函式進行賦值。陣列成員複製是個例外,對於陣列成員,複製陣列中的每乙個元素。
1.3由於複製建構函式是一種特殊的建構函式,因此其執行過程也和建構函式一樣,可以使用初始化式進行成員變數的複製(在這裡呼叫的是複製建構函式而不是建構函式),即便自己定義了建構函式,如果沒有定義複製建構函式,編譯器還是為我們生成乙個。
測試例子
class b
; b()
編譯器生成的賦值操作符的操作是,執行逐個成員的賦值:右運算元物件的每個成員賦值給左運算元物件的對應成員-----淺拷貝,對於類物件,呼叫其型別的賦值操作符。對於陣列元素則採用為每個陣列元素進行賦值。
注意在編寫自己的賦值操作符操作的時候,要注意自我賦值的時候。加上判斷if(this==&類物件)
三、析構函式
如果乙個類型別變數在超過作用域時候會呼叫析構函式。乙個動態分配的物件在指向該物件的指標被刪除時呼叫析構函式。撤銷乙個容器的時候,也對進行容器中類型別元素的析構函式,並且是按逆序撤銷的。
無論我們自己是否定義乙個析構函式,編譯器總是為我們生成乙個析構函式。這個生成的析構函式按照非靜態成員變數在類中的宣告的逆序來撤銷物件。
自己定義的析構函式不能過載,只能有乙個,無引數,無返回值。形式如:~b();b為類名。
C Primer複製控制 13 3 析構函式
如果類需要析構函式,則它也需要賦值操作符和複製建構函式,這是乙個有用的經驗法則。這個規則常稱為 三法則,指的是如果需要析構函式,則需要所有這三個複製控制成員。複製建構函式或賦值操作符不同,編譯器總是會為我們合成乙個析構函式。合成析構函式按物件建立時的逆序撤銷每個非static 成員,因此,它按成員在...
C 複製建構函式和析構函式
首先,先來解釋一下幾個概念 複製建構函式 析構函式 複製建構函式 是一種特殊建構函式,具有單個形參,該形參 常用const修飾 是對該類型別的引用。當定義乙個新物件並且對他初始化的時,將顯示使用複製建構函式。當將該型別的物件傳遞給函式或者從函式返回該型別的物件的時候,將隱式的使用複製建構函式。析構函...
複製控制 複製建構函式 賦值操作符 析構函式
複製建構函式 copy constructor 具有單個形參,該形參是對該類型別的引用 常用const修飾 用於 a.根據另乙個同型別的物件顯式或隱式初始化乙個物件。b.複製乙個物件,將它作為實參傳給乙個函式。c.從函式返回時複製乙個物件。d.初始化順序容器中的元素。e.根據元素初始化式列表初始化陣...