預設拷貝建構函式 預設賦值操作

2021-05-24 09:56:14 字數 972 閱讀 3163

做了一道題,錯了。收藏下:

#include 

#include 

using

namespace std;  

class person  

~person()  

};  

class beauty : public person  

~beauty()  

virtual

void say()  

private:  

int* _p;  

};  

void test()  

int main()  

a : 沒什麼問題,編譯通過,執行也不報錯。

b : 會有執行問題,第46行呼叫了預設拷貝操作,造成b1和b2中的_p是指向同一段資料,結果析構時,同一段記憶體將被釋放兩次。

c : 除了b的問題外,基類析構函式不是虛的(virtual),這顯然也是乙個問題。

d : 認同c,但認為b的表達有點小誤差,第46行既然用的是「=」操作符,那就應該呼叫的是預設的賦值操作。

答案:c(自己選擇了d)

分析:1, person既作為基類存在,又確實擁有乙個虛函式 say。那良好的設計確實應該是提供virtual的析構函式。否則,以下**就會有問題: person *p = new beauty; delete p // beauty中的_p記憶體被洩漏了。

2.46行等同以下操作: beauty b2(b1); 它呼叫的是拷貝構造。如果是這麼寫: beauty b2; b2 = b1; 那麼呼叫的才是預設的賦值操作,這時d就是對的。當然,這裡的重點是: 預設的拷貝構造也好,預設認的賦值操作也好,對物件的成員資料,都是「淺拷貝」,結果兩個物件的_p確實會指向同一塊記憶體。打個比方,指標就像存摺,折子上有100萬元。淺拷貝只是把存摺影印乙份,b1和b2各乙份。帳號相同,結果銀行裡的錢當然是同乙份。想要實現「深拷貝」(讓銀行裡的錢也變兩份),需要自己寫拷貝構造和賦值操作。

預設拷貝建構函式

1.什麼時候用到拷貝建構函式?以乙個已經存在的物件初始化同型別的另乙個物件時,如 class a a a a aa a 作為函式引數時,產生臨時物件,呼叫拷貝建構函式進行初始化 void fun a a 作為函式返回值時,產生臨時物件 a fun a a return a 產生臨時物件,並呼叫拷貝建...

拷貝建構函式,預設拷貝建構函式

拷貝建構函式,預設拷貝建構函式 1.c 的預設拷貝建構函式,從深度拷貝和淺拷貝說起 c 類的預設拷貝建構函式的弊端 c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有...

預設建構函式和合成預設建構函式

當我們沒有為類中的物件提供初始值,此時就會執行預設初始化,類會通過乙個特殊的建構函式來控制預設初始化過程,這個函式叫做預設建構函式,這個函式並不需要任何的實參,但是如果我們的類沒有顯式地定義建構函式,那麼編譯器就會為我們隱式地定義乙個預設建構函式 只要沒有顯式定義建構函式,編譯器就會提供預設建構函式...