由導學寶**:
今天特意研究下了深拷貝和淺拷貝:
首先介紹一下:
c#中有兩種型別變數,一種 是值型別變數,一種是引用型別變數。對於前者,copy是屬於全盤複製;而對於後者,一般的copy只是淺copy,相當於只傳遞乙個引用指標一樣。因此 對於後者進行真正copy的時候,也是最費事的,具體的說,必須為其實現icloneable介面中提供的clone方法。
淺拷貝(影子轉殖):只複製物件的基本型別,物件型別,仍屬於原來的引用.
深拷貝(深度轉殖):不緊複製物件的基本類,同時也複製原物件中的物件.就是說完全是新物件產生的.
淺 拷貝和深拷貝之間的區別:淺拷貝是指將物件中的數值型別的字段拷貝到新的物件中,而物件中的引用型字段則指複製它的乙個引用到目標物件。如果改變目標物件 中引用型字段的值他將反映在原是物件中,也就是說原始物件中對應的字段也會發生變化。深拷貝與淺拷貝不同的是對於引用的處理,深拷貝將會在新物件中建立一 個新的和原是物件中對應字段相同(內容相同)的字段,也就是說這個引用和原是物件的引用是不同的,我們在改變新物件中的這個欄位的時候是不會影響到原始對 象中對應欄位的內容。所以對於原型模式也有不同的兩種處理方法:物件的淺拷貝和深拷貝。
memberwiseclone 方法建立乙個淺表副本,方法是建立乙個新物件,然後將當前物件的非靜態字段複製到該新物件。如果欄位是值型別的,則對該字段執行逐位複製。如果欄位是引用 型別,則複製引用但不複製引用的物件;因此,原始物件及其複本引用同一物件。深拷貝,即實現icloneable介面.icloneable可用於深拷貝 和淺拷貝。
這些都是概念,但是需要我們理解,下面介紹例項:
其中.memberwiseclone()在上面已經介紹過了,通過例項可以清楚看到淺拷貝與深拷貝的區別
再來個:
接下來介紹一下陣列的拷貝:
首先陣列的直接拷貝也就是複製,不用多說看例子:
int numbers = ;
int numberscopy = numbers;
numberscopy[2] = 0;
console.write(numbers[2]);
console.write(numberscopy[2]);
結果就是
道理很簡單,陣列的複製也就是引用傳遞,指向的是同乙個位址,這不是我們介紹的重點
接下來看一下概念
陣列是引用型別,所以將乙個陣列變數賦予另乙個陣列變數,就會得到兩個指向同一陣列的變數。而複製陣列,會使陣列實現icloneable介面。這個介面定義的clone()方法會建立陣列的淺副本。
如果陣列的元素是值型別,就會複製所有的值,如果陣列包含引用型別,則不複製元素,而只複製引用,
除了使用clone()方法之外,還可以使用array.copy()方法建立淺副本。但clone()方法和copy()方法有乙個重要區別:clone()方法會建立乙個新陣列,而copy()方法只是傳送了階數相同、有足夠元素空間的已有陣列。
如果需要包含引用型別的陣列的深副本,就必須迭代陣列,建立新物件。
看一下例子:
我這裡介紹的主要是陣列的clone和copyto的用法,兩者都不會改變其中的值,與上面我們的複製有很大的區別
因為陣列裡面是值型別,所以他們不存在引用,而
class class1
class class4
}結果是兩者都改變了值,最後輸出都是bb,那時因為兩者都是淺拷貝,區別上面已經介紹了,所以
都沒有實現深拷貝,以上如果分析有錯誤請大家指出,這只是我這麼認為!
C 深拷貝 與 淺拷貝
最近在寫一些c 程式,遇到個問題,記憶體會出錯,查了一些材料,終於發現問題所在了,原來碰到了傳說中的深拷貝和淺拷貝問題了,檢視一些材料,現在對這個問題做個總結 在類定義中,預設是淺拷貝,即 位拷貝 用在基本類中或者一些沒有指標的自定義型別中沒有一點問題,但是當遇到含有指標變數的自定義型別的時候,就會...
C 淺拷貝與深拷貝
淺拷貝 shallow copy 指的是當物件的字段被拷貝的時候,字段應用的物件不會被拷貝。深拷貝是對物件例項當中的字段引用的物件也進行拷貝的一種方式。淺拷貝可以通過將類實現介面icloneable class myclass icloneable 舉個簡單的例項 using system usin...
c 深拷貝與淺拷貝
對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 88 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。iostream using namespace std class cexample void show ...