深拷貝:在堆區重新申請空間,進行拷貝操作
淺拷貝:簡單的複製拷貝操作
class
person
person
(int age)
`person()
int m_age;
}void
test()
當引數中有堆區引數,改造之後:
class
person
person
(int age,
int height)
`person()
cout<<
"析構函式呼叫"
<}int m_age;
int*m_height;
//身高 用指標是為了開闢到堆區
}void
test()
上面這個**執行完成後,將會報錯,報:物件的初始化和清理。
因為對於age這個屬性,當person p2(p1)時,編譯器會呼叫自己的拷貝建構函式,會做淺拷貝操作,會逐字節的將p1的元素拷貝到p2中。但是在堆區的height屬性,他同樣會將堆區的位址拷貝到p2。當p1和p2執行析構函式時,p2會率先被釋放,當p1釋放時,發現該記憶體已經被釋放過了,自己再操作這塊記憶體就屬於非法操作,淺拷貝帶來的問題就是:堆區的記憶體重複釋放。
解決辦法:
利用深拷貝來解決他。重寫拷貝建構函式,重新在堆區建立空間。
//重寫拷貝建構函式,實現深拷貝
person
(const person &p)
拷貝建構函式 深淺拷貝
為什麼拷貝建構函式必須為引用傳遞,不能是值傳遞 簡單的回答bai是為了防止遞迴引用。du 具體一些zhi可以這麼講 當 乙個dao物件需要zhuan以值方式傳遞時,編譯shu器會生成 呼叫它的拷貝建構函式以生成乙個複本。如果類a的拷貝建構函式是以值方式傳遞乙個類a物件作為引數的話,當 需要呼叫類a的...
拷貝建構函式,預設拷貝建構函式
拷貝建構函式,預設拷貝建構函式 1.c 的預設拷貝建構函式,從深度拷貝和淺拷貝說起 c 類的預設拷貝建構函式的弊端 c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有...
拷貝和深淺拷貝
當list2為list的拷貝物件時,list內的可變資料型別變化,list2變化 list內的不可變資料型別變化,list2變化。總之 list變化list2一定變化 list 1,2,3,4,list2 list print list print list2 1,2,3,4,5 1,2,3,4,5...