拷貝建構函式
拷貝建構函式: 以乙個物件的內容去初始化另個物件。 (關鍵在於初始化)
有三種情況下會呼叫拷貝建構函式
class x ;
(1)x x; x xx=x //不是賦值操作而是拷貝建構函式
(2)void foo (x x); // 物件引數
(3)foobar() // 返回物件
如果類沒有提供顯示的拷貝建構函式,編譯器採用的是位逐次拷貝。也就是把物件資料成員值拷貝到另個物件上,如果遇到物件成員就會遞迴進去。
class string
;class word
;位逐次拷貝時先位逐次拷貝int occurs 遇到string後遞迴進 class string 位逐次拷貝。
當以下情況下編譯器不會採用位逐次拷貝,而是生成預設的拷貝建構函式
(1)當類內含乙個物件成員,而後者的類中宣告了乙個拷貝建構函式時 (包括程式設計師寫的,編譯器合成的)
class string
;class word
;//就會合成乙個 : word::word(const word &wd)
(2)當類繼承乙個基類時,而後者存在乙個拷貝建構函式時
class word :public string
//就會合成乙個
(3)當類宣告了虛函式時
class word
// 同理與建構函式一樣的理由,拷貝建構函式要處理虛函式指標和虛函式表。
(4)當類派生自乙個繼承鏈中有虛繼承時
class zoo;
class racconn :public virtual zoo ;
class readpanda : public racconn ;
這個時候不是乙個類物件要另個類物件做初始化而是基類物件要派生類物件來初始化
raccoonn rocky; racconn little=rocky; // 簡單的位逐次拷貝就行了
redpanda littered; racconnn littecritter = rocky ;
// 簡單的位逐次拷貝就不行了,編譯器必須明確地初始化littercritter 虛繼承的指標。
物件模型 拷貝建構函式2
include using namespace std 關於類不展現按位拷貝語義的幾種情況 1.類的成員物件含有預設拷貝函式 2.繼承的基類包含拷貝函式 無論是合成的還是自己定義的 3.有虛函式,因為虛指標按位拷貝有問題 4.派生自虛基類 class word word private intcnt...
C 物件模型 拷貝建構函式語義
目錄引例 如果乙個類a沒有拷貝建構函式,但是含有乙個類型別ctb的成員變數m ctb。該型別ctb含有拷貝建構函式,那麼當 中有涉及到類a的拷貝構造時,編譯器就會為類a合成乙個拷貝建構函式。如果乙個類ctbson沒有拷貝建構函式,但是它有乙個父類ctb,父類有拷貝建構函式,當 中有涉及到類ctbso...
C 物件模型學習筆記五 拷貝建構函式語義
測試驗證編譯器在什麼情況下會幫助我們合成出拷貝建構函式,及編譯器合成出來的拷貝建構函式又要幹什麼事情?拷貝建構函式語義 在下面情況下,如果我們不寫自己的拷貝建構函式,編譯器就會幫助我們合成出拷貝建構函式來。1 如果乙個類t沒有拷貝建構函式,但是含有乙個類型別ctb的成員變數m ctb。該型別ctb含...