深度搜尋C 物件模型 複製建構函式

2021-06-25 20:23:28 字數 1741 閱讀 2237



深度搜尋c++物件模型: 複製建構函式

由建構函式篇可以猜到, 複製建構函式其實也"不一定"會被編譯器產生..

提到複製,自然是類成員之間的複製, 有三種情況 會把乙個 class object 的內容作為另乙個 class object 的初值:

--> 對乙個 class object 做顯示的初始化操作:

class a ;

a a;

a b = a;

--> 對乙個 class object 做傳值呼叫:

void func( a a );

a a;

void func( a );

--> 當函式傳遞歸乙個 class object :

a func()

當乙個 class object "不展現" bitwise copy semantics ( 位逐次拷貝 ) 時, 編譯器才會為 class 合成乙個複製建構函式;

對於乙個普通的類來說 他本身是"展現位逐次拷貝" 的,但是在以下幾種情況 他會"失去位逐次拷貝",此時編譯器會為他合成複製建構函式

---> 當 class 內含乙個 class member object, 而且這個 class member object 有乙個 複製建構函式,

( "重申": 存在乙個複製建構函式, 不管這個複製建構函式是被顯示了宣告了,還是因為某種原因被編譯器合成了 )

---> 當 class 繼承自乙個 base class, 而且這個 base class 存在乙個 複製建構函式,

( "重申": 存在乙個複製建構函式, 不管這個複製建構函式是被顯示了宣告了,還是因為某種原因被編譯器合成了 )

---> 當 class 內使用了 virtual function 機制: ( 主要是 vptr )

class zooanimal ;

class bear : public zooanimal ;

bear yogi;

bear wninie = yogi;

此時 yogi 會被 預設建構函式初始化, 然後 yogi 的 vptr 被設定為指向了 bear class virtual table,

因此 把 yogi 的 vptr 通過 "位逐次拷貝" 複製給 wninie 是安全的;

zooanimal franny = yogi;

此時 發生了一次"切割", 但是我們通過 "位逐次拷貝" 分析,則會發現 franny 的 vptr 被設定為了 yogi 的 vptr ( 其實是 bear class virtual table )

這不符合實際情況, 所以編譯器要合成乙個預設複製建構函式, 來顯示的把 franny 的 vptr 設定為指向 zooanimal class virtual table;

---> 當 class 派生自乙個繼承串鏈, 其中有 virtual base class

class a ;

class b : virtual public a ;

總結: 以上4種情況, "編譯器必須為未宣告複製建構函式的類合成乙個預設複製建構函式",

至於"不屬於以上4種情況的而且又沒有宣告複製建構函式", "沒有複製建構函式會被合成出來";

什麼時候我們需要乙個 複製建構函式?

答案: 不一定

一般來說 我們沒有任何理由提供給程式乙個複製建構函式,因為編譯器已經為我們做了最合理的事情

但是 當我們預見到我們的程式需要進行" 傳值複製乙個 member object " 的時候 那麼提供乙個複製建構函式是合情合理的

複製建構函式和深度複製

如果類中包含了使用new初始化的指標成員,應當定義乙個複製建構函式,以複製指向的資料,而僅僅是指標。複製建構函式用於將乙個物件複製到新建立的物件中,因此,它用於初始化過程中 包括按值傳遞引數 而不是常規的賦值過程中。原型 class name const class name class strin...

物件 複製建構函式

複製建構函式必須將形參指定為 const 引用 若複製建構函式寫成如下 cbox cbox initb 由於是按值傳遞,所以編譯器會首先建立物件的副本,而建立物件的副本需要呼叫複製建構函式,又會建立新的物件,新物件又會呼叫複製建構函式 會持續不休,最終得到對複製建構函式的無窮呼叫。解決方法如下 cb...

c 類與物件(1) 構造,複製建構函式

當我們定義乙個基本型別變數時,方法如下 int p 定義乙個int型別變數 bool b 定義乙個bool型別變數 float c 定義乙個float型別變數 顯然定義變數p適用於儲存整數型別的,變數b是用於儲存布林型別的,變數c是用於儲存浮點數型別的。但是變數宣告的意義不只是這個,另乙個同樣重要的...