淺複製與深複製

2021-08-27 08:00:46 字數 949 閱讀 1494

舉個複製**的例子:

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'

由上面的例子可以看出,當執行淺複製時,如果物件裡包含子物件,當我們對b物件進行修改時c物件也會受到影響,這是因為淺複製是複製引用,複製後的引用都是指向同乙個物件的例項,因此彼此之間的操作會互相影響

現在我們來對淺複製的**進行一下小小改動,實現深複製:

function

deepclone

(p,s) ;

for (var prop in p) ;

deepclone(p[prop],s[prop]);

} else

} return s;

}var a = };

var b = {};

clone(a,b);

b.hobby[1] = 'reading';

b.hobby[1] // 'reading'

c.hobby[1] // 'running'

由上例子可知,深複製可以解決淺複製的弊端,對於b物件進行修改時c物件也不會受到影響,這是因為深複製不是簡單的複製引用,而是在堆中重新分配記憶體,並且把源物件例項的所有屬性都進行新建複製,以保證深複製的物件的引用圖不包含任何原有物件或物件圖上的任何物件,複製後的物件與原來的物件是完全隔離的。由深複製的定義來看,深複製要求如果源物件存在物件屬性,那麼需要進行遞迴複製,從而保證複製的物件與源物件完全隔離。

深複製與淺複製

2者主要區別 是否為成員變數分配新記憶體空間 複製建構函式有2種 深複製與淺複製 當將乙個物件a複製給另乙個物件b時,系統會呼叫複製建構函式 編譯器預設的複製建構函式是淺拷貝,它將原物件的每乙個成員變數複製到新物件的成員變數中去。因而最後兩個物件的變數均指向相同的資料成員的記憶體位址。當資料成員中沒...

淺複製與深複製

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

淺複製 深複製

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