深拷貝與淺拷貝

2022-07-17 19:27:09 字數 2085 閱讀 1546

1.         深拷貝是指源物件與拷貝物件互相獨立,其中任何乙個物件的改動都不會對另外乙個物件造成影響。比較典型的就是value(值)物件,如預定義型別int32,double,以及結構(struct),列舉(enum)等。

考慮以下寫法

int source = int.maxvalue;//(1)初始化源物件為整數的最大值2,147,483,647

int dest = source;//(2)賦值,內部執行深拷貝

dest = 1024;//(3)對拷貝物件進行賦值

source = 2048;//(4)對源物件進行賦值

首先(2)中將source賦給dest,執行了深拷貝動作,其時dest和source的值是一樣的,都是int.maxvalue;(3)對dest進行修改,dest值變為1024,由於是深拷貝,因此不會執行source,source仍然是int.maxvalue;(4)對source進行了修改,同樣道理,dest仍然是1024,同時int.maxvalue的值也不變,仍然是2,147,483,647;只有source變成了2048。

再考慮以下寫法

struct point

}point source = new point(10, 20);

point dest = source;

dest.x = 20

當dest.x屬性變成20後,source的x屬性仍然是10

2.         淺拷貝是指源物件與拷貝物件共用乙份實體,僅僅是引用的變數不同(名稱不同)。對其中任何乙個物件的改動都會影響另外乙個物件。舉個例子,乙個人一開始叫張三,後來改名叫李四了,可是還是同乙個人,不管是張三缺胳膊少腿還是李四缺胳膊少腿,都是這個人倒霉。比較典型的就有reference(引用)物件,如class(類)。

考慮以下寫法

class point

}point source = new point(10, 20);

point dest = source;

dest.x = 20;

由於point現在是引用物件,因此point dest=source的賦值動作實際上執行的是淺拷貝,最後的結果應該是source的x字段值也變成了20。即它們引用了同乙個物件,僅僅是變數明source和dest不同而已。

3.         引用物件的淺拷貝原理

引用物件之間的賦值之所以執行的是淺拷貝動作,與引用物件的特性有關,乙個引用物件一般來說由兩個部分組成

(1)乙個具名的handle,也就是我們所說的宣告(如變數)

(2)乙個內部(不具名)的物件,也就是具名handle的內部物件。它在manged heap(託管堆)中分配,一般由新增引用物件的new方法是進行建立

如果這個內部物件已被建立,那麼具名的handle就指向這個內部物件在manged heap中的位址,否則就是null(從某個方面來講,如果這個具名的handle可以被賦值為null,說明這是乙個引用物件,當然不是絕對)。兩個引用物件如果進行賦值,它們僅僅是複製這個內部物件的位址,內部物件仍然是同乙個,因此,源物件或拷貝物件的修改都會影響對方。這也就是淺拷貝

4.         引用物件如何進行深拷貝

由於引用物件的賦值僅僅是複製具名handle(變數)指向的位址,因此要對引用物件進行深拷貝就要重新建立乙份該物件的例項,並對該物件的字段進行逐一賦值,如以下寫法

class point

}point source = new point(10, 20);

point dest = new point(source.x, source.y);

//或以下寫法

//point dest = new point()

= source.x

= source.y

其時,source和dest就是兩個互相獨立的物件了,兩者的修改都不會影響對方

5.一些需要注意的東西

(1):string字串物件是引用物件,但是很特殊,它表現的如值物件一樣,即對它進行賦值,分割,合併,並不是對原有的字串進行操作,而是返回乙個新的字串物件

(2):array陣列物件是引用物件,在進行賦值的時候,實際上返回的是源物件的另乙份引用而已;因此如果要對陣列物件進行真正的複製(深拷貝),那麼需要新建乙份陣列物件,然後將源陣列的值逐一拷貝到目的物件中

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝與深拷貝

淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...