深複製與淺複製

2021-08-30 23:07:31 字數 503 閱讀 7463

2者主要區別:是否為成員變數分配新記憶體空間

複製建構函式有2種:深複製與淺複製

當將乙個物件a複製給另乙個物件b時,系統會呼叫複製建構函式

編譯器預設的複製建構函式是淺拷貝,它將原物件的每乙個成員變數複製到新物件的成員變數中去。因而最後兩個物件的變數均指向相同的資料成員的記憶體位址。

當資料成員中沒有指標時,淺拷貝是可行的。

但當資料成員中有指標時,如果採用簡單的淺拷貝,則兩類中的兩個指標將指向同乙個位址m,當程式中刪除乙個物件a時,析構函式會釋放掉指標變數所指向的那塊記憶體空間m,而物件b的指標變數仍然指向該空間m,而此時該空間已不存在,因而導致指標懸掛現象。

所以,這時,必須採用深拷貝,建立自己的複製建構函式。 我們自己來為我們的成員變數分配新記憶體,這樣乙個物件在析構後只是刪除自己相關的記憶體空間,而不會影響到另乙個物件。

深拷貝與淺拷貝的區別就在於深拷貝會在堆記憶體中另外申請空間來儲存資料,從而也就解決了指標懸掛的問題。

簡而言之,當資料成員中有指標時,必須要用深拷貝。

淺複製與深複製

舉個複製 的例子 function clone p,s for var prop in p return s var a var b clone a,b b.hobby 1 reading b.hobby 1 reading c.hobby 1 reading 由上面的例子可以看出,當執行淺複製時,...

淺複製與深複製

1.淺複製 被複製物件的所有變數都含有與原來的物件相同的值,而其所有的對其他物件的引用都仍然指向原來的物件。說明 乙個物件中的資料成員 include using namespace std class test test const test c 複製建構函式,提供乙個同型別物件作為引數 void...

淺複製 深複製

second,來說說shallow copy and deep copy的定義和我自己的一些理解。僅供參考 淺複製 shallow copy 如果欄位是值型別的。則對該字段執行逐位複製,如果欄位是引用型別,則複製引用但不複製引用的物件 因此,原始物件及其副本引用同一物件。即被複製物件的所有變數都含有...