C 淺拷貝和深拷貝

2021-05-23 09:38:33 字數 710 閱讀 2627

class test

//test(const test &t) : _val(new int(*(t._val))) {}

~test()   

private:

int *_val;

};現在定義兩個物件,

test t1(9);

test t2(t1);

如果你不提供copy建構函式(注釋掉的那個), 那麼t1和t2的成員_val指向同乙個物件, 當析構的時候, 同乙個物件被析構了兩次, 肯定出問題了.

反之, 提供了被注釋的copy建構函式, t2的_val指向了乙個新物件, 這樣程式就沒問題了.

前者就是淺拷貝, 後者就是深拷貝.

例如,在乙個類中,有乙個指向乙個buffer的指標,所以我們可以說這個指標指向了乙個資源(這個資源可以是一塊儲存資料的記憶體)。

淺拷貝,也就是按照位元一位一位地進行拷貝,是把乙個類完全一樣拷貝到另乙個類。這時就出現問題了:類內部的指標的值是一樣的,也就是說,兩個類的例項內部的指標指向了同一塊記憶體。當這兩個物件析構的時候,同一塊記憶體就會給析構兩次,當然會出現問題。

深拷貝,就是在這點上和淺拷貝不同的,也就是說,在拷貝的時候,深拷貝會提供一塊新的記憶體用來儲存資料,並使新的物件的指標指向這塊記憶體,這兩個物件析構的時候,也就不會把同一塊記憶體析構兩次了。

一般,如果乙個類的作者沒有提供乙個拷貝建構函式,編譯器會自動提供乙個拷貝函式,而這個拷貝函式就是淺拷貝。

c 深拷貝和淺拷貝

深拷貝和淺拷貝 ca const ca c 就是我們自定義的拷貝建構函式。可見,拷貝建構函式是一種特別的建構函式,函式的名稱必須和類名稱一致,他的唯一的乙個引數是本型別的乙個引用變數,該引數是const型別,不可變的。例如 類x的拷貝建構函式的形式為x x x 當用乙個已初始化過了的自定義類型別物件...

c 深拷貝和淺拷貝

對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 88 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。iostream using namespace std class cexample void show ...

c 深拷貝和淺拷貝

c 預設的拷貝建構函式是淺拷貝 淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b....