形象地聊聊C 中的淺拷貝與深拷貝

2021-06-26 21:33:10 字數 1070 閱讀 2647

先來看乙個簡單的程式:

#include using namespace std;

class point

};int main()

好, 繼續看:

#include using namespace std;

class point

};int main()

由此可見, 淺拷貝就是淺淺的傻傻的拷貝。 上面這個程式會引出乙個問題: 如果a.ptest指向了某乙個堆, 那麼b.ptest也指向了同一地方。 我們來看看:

#include using namespace std;

class point

};int main()

顯然, 如果析構, 則會有兩次釋放同一堆空間, 危險!!!看看這個危險的**:

#include using namespace std;

class point

~point() };

int main()

上面的**不僅錯誤, 而且從邏輯上吧物件a和b無形地建立了關聯, 顯然是不合理的。

看來, 編譯器預設的拷貝建構函式是太膚淺了, 編譯器不可能做那麼多東西, 從邏輯上來講,也無法做。 是該搞點深的了, 來看程式設計師自己需要寫的深拷貝:

#include using namespace std;

class point

~point()

point(point& p) // 不能是point(point p) };

int main()

這就是深拷貝, 依靠程式設計師自己的實現, 撇清a物件和b物件的關係。

來個形象的總結吧: 

淺拷貝: 丈夫有100元, 取了個沒有錢的妻子後, 自己與妻子共同掌管這100元, 花著花著, 有可能吵架呢

深拷貝: 丈夫有100元, 取了個有100塊錢的妻子後, 自己有100, 妻子有100,  各花各的, 互不干擾, 沒有什麼爭吵

c 中深拷貝與淺拷貝

如果沒有自定義複製建構函式,則系統會建立預設的複製建構函式,但系統建立的預設複製建構函式只會執行 淺拷貝 即將被拷貝物件的資料成員的值一一賦值給新建立的物件,若該類的資料成員中有指標成員,則會使得新的物件的指標所指向的位址與被拷貝物件的指標所指向的位址相同,delete該指標時則會導致兩次重複del...

C 中的淺拷貝與深拷貝

用自定義的string類解釋什麼是淺拷貝什麼是深拷貝。class string 淺拷貝是在呼叫拷貝函式時進行了值拷貝,這樣的拷貝看似沒有問題,在呼叫析構函式時會導致記憶體洩漏,系統奔潰。define crt secure no warnings 1 includeusing namespace st...

C 中的深拷貝與淺拷貝

1 拷貝建構函式 定義 如果乙個類的建構函式的第乙個引數是類自身類型別的引用,且任何額外引數都有預設值,則此建構函式為拷貝建構函式。由此可見,拷貝建構函式是一種特殊的建構函式,乙個類可以有多個拷貝建構函式,既可以是public的,也可以是private的 特殊用法,如設計模式中的單例模式需要將拷貝建...