C 中的深複製與淺複製

2022-03-14 21:38:33 字數 3250 閱讀 8369

有的時候,我們習慣性的將乙個引用型別交給另乙個引用型別,此時我們修改某一引用,便會帶來所有引用值的改變。其實這是一種淺複製,那麼為了更好的實現直接賦值,而又避免出現上面這種情況。最好採用深複製,以下內容**自:

c#中對於資料的複製機制雖然簡單但是容易讓人誤解。c#資料型別大體分為值型別(value type)與引用型別(reference type)。對於值型別資料,複製的時候直接將資料複製給另外的變數,而對於引用型變數而言,複製時,其實只是複製了其引用。複製引用的方式叫淺複製,而逐一複製被複製物件的資料成員的方式稱為深複製。例如

person p1=new person;//初始化乙個person物件

如果現在有如下語句,

person p2=p1;

p2.address=new addressinfo;

那麼,此時p1.address.postcode=?

因為person的address屬性為引用型別,因此,net預設其複製方式為淺複製,即是說在p2=p1時,將p1.address的引用傳給了p2.adrress,即是p1.address與p2.address指向相同的記憶體空間。當改變p2的address屬性時,p1.address屬性也會相應改變。因此最後p1.address.postcode=100878。

.net中object類提供了乙個memberwiseclone方法實現的就是上述機制。

要對物件實現深複製。我們可以通過實現icloneable介面。

icloneable介面只提供了乙個clone()抽象方法。只要在類中實現它即可。比如現在我要實現person類的深複製。則可以如下

public class person :icloneable

public object  clone()

person newperson = (person)this.memberwiseclone();//先呼叫預設的複製機制

addressinfo address=new addressinfo;

newperson.address=address;

return newperson; 

這樣就實現物件的深複製。

可以這樣呼叫(續上面的**),p2=(person)p1.clone();此時再

p2.address=new addressinfo;

p1的address不再改變。

c#中對於資料的複製機制雖然簡單但是容易讓人誤解。c#資料型別大體分為值型別(value type)與引用型別(reference type)。對於值型別資料,複製的時候直接將資料複製給另外的變數,而對於引用型變數而言,複製時,其實只是複製了其引用。複製引用的方式叫淺複製,而逐一複製被複製物件的資料成員的方式稱為深複製。例如

person p1=new person;//初始化乙個person物件

如果現在有如下語句,

person p2=p1;

p2.address=new addressinfo;

那麼,此時p1.address.postcode=?

因為person的address屬性為引用型別,因此,net預設其複製方式為淺複製,即是說在p2=p1時,將p1.address的引用傳給了p2.adrress,即是p1.address與p2.address指向相同的記憶體空間。當改變p2的address屬性時,p1.address屬性也會相應改變。因此最後p1.address.postcode=100878。

.net中object類提供了乙個memberwiseclone方法實現的就是上述機制。

要對物件實現深複製。我們可以通過實現icloneable介面。

icloneable介面只提供了乙個clone()抽象方法。只要在類中實現它即可。比如現在我要實現person類的深複製。則可以如下

public class person :icloneable

public object  clone()

person newperson = (person)this.memberwiseclone();//先呼叫預設的複製機制

addressinfo address=new addressinfo;

newperson.address=address;

return newperson; 

這樣就實現物件的深複製。

可以這樣呼叫(續上面的**),p2=(person)p1.clone();此時再

p2.address=new addressinfo;

p1的address不再改變。

c#中對於資料的複製機制雖然簡單但是容易讓人誤解。c#資料型別大體分為值型別(value type)與引用型別(reference type)。對於值型別資料,複製的時候直接將資料複製給另外的變數,而對於引用型變數而言,複製時,其實只是複製了其引用。複製引用的方式叫淺複製,而逐一複製被複製物件的資料成員的方式稱為深複製。例如

person p1=new person;//初始化乙個person物件

如果現在有如下語句,

person p2=p1;

p2.address=new addressinfo;

那麼,此時p1.address.postcode=?

因為person的address屬性為引用型別,因此,net預設其複製方式為淺複製,即是說在p2=p1時,將p1.address的引用傳給了p2.adrress,即是p1.address與p2.address指向相同的記憶體空間。當改變p2的address屬性時,p1.address屬性也會相應改變。因此最後p1.address.postcode=100878。

.net中object類提供了乙個memberwiseclone方法實現的就是上述機制。

要對物件實現深複製。我們可以通過實現icloneable介面。

icloneable介面只提供了乙個clone()抽象方法。只要在類中實現它即可。比如現在我要實現person類的深複製。則可以如下

public class person :icloneable

public object  clone()

person newperson = (person)this.memberwiseclone();//先呼叫預設的複製機制

addressinfo address=new addressinfo;

newperson.address=address;

return newperson; 

這樣就實現物件的深複製。

可以這樣呼叫(續上面的**),p2=(person)p1.clone();此時再

p2.address=new addressinfo;

p1的address不再改變。

C 深複製與淺複製

c 中對於資料的複製機制雖然簡單但是容易讓人誤解。c 資料型別大體分為值型別 value type 與引用型別 reference type 對於值型別資料,複製的時候直接將資料複製給另外的變數,而對於引用型變數而言,複製時,其實只是複製了其引用。複製引用的方式叫淺複製,而逐一複製被複製物件的資料成...

淺複製與深複製

舉個複製 的例子 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 由上面的例子可以看出,當執行淺複製時,...

深複製與淺複製

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