02 淺拷貝 深拷貝

2022-08-28 13:45:19 字數 2237 閱讀 8564

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;

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

淺拷貝 深拷貝

copy mutablecopy copy 不管是可變的,還是不可變的,結果都是不可變的 mutablecopy 不管是不可變的,還是可變的,結果都是可變的 nsmutablestring str nsmutablestring stringwithformat a nsarray arr1 str...

深拷貝 淺拷貝

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

淺拷貝 深拷貝

retain是建立乙個指標,引用物件計數加1。copy屬性表示兩個物件內容相同,新的物件retain為1 與舊有物件的引用計數無關,舊有物件沒有變化。copy減少物件對上下文的依賴。retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,re...