在程式設計中,我們有時希望得到現有乙個物件的拷貝。
拷貝有兩種:
(1)淺拷貝(也稱淺表複製);(2)深拷貝(也稱深度複製)
1.淺拷貝
表示將所有非引用資料型別從乙個物件複製到另乙個物件;如果原有物件包含對像引用,則複製對角引用(即是指當物件的字段值被拷貝時,欄位的引用物件不會被拷貝)。形成拷貝後的物件與原物件會引用同乙個值。
值的改變:修改副本中的物件引用時,原始列表也將更改,但當修改非引用項時,原始項保持不變。
如果希望自己的型別實現淺拷貝;可以像下面這樣在方法中呼叫system.object的受保護方法memberwiseclone即可:
public object clone()
例項1:
using system;
輸出:第一行: 20
第二行: 10
第三行: 1,2,3
第四行: 1,2,3
第五行: 10
第六行: 40
第七行: 40,2,3
第八行: 40,2,3
**說明: 第一行至第四行說明:實現了已例項化物件pa的淺拷貝物件pb,故pb擁有與pa一樣的值,且指向同乙個物件ptest
第五行至第六行說明:淺拷貝對於修改非引用項(型別)時,原始項保持不變。故當改變pb.height=40;後pa.height仍為原來的值10;
第七行至第八行說明:淺拷貝對於修改的物件引用項(型別)時,原始列表也將更改。故當改變引用型別 int v 的v[0]=40;後兩個物件的int v的值都會改變.
2.深拷貝:是一種對物件例項中的引用物件也進行了拷貝的一種形式;如乙個物件中有乙個指向字串的字段,並且我們對這個物件進行了深拷貝的話;將建立乙個新的物件和乙個新字串,新物件將引用新的字串字段。而且當我們對乙個物件進行深拷貝後,兩個物件將不會共享任何東西,改變任何乙個物件對另乙個物件不會產生任何影響。
ex:using system;
class deepcopy : icloneable
;// 預設建構函式
public deepcopy()
// 供clone方法呼叫的私有建構函式
private deepcopy(int v)
public object clone()
public void display()
}class client
} 這次在轉殖的時候,不但轉殖物件本身,連裡面的陣列字段一併轉殖。因此,最終列印出來的dc1與dc2不同
輸出:9,2,3
1,2,3 //當我們對乙個物件進行深拷貝後,兩個物件將不會共享任何東西,改變任何乙個物件對另乙個物件不會產生任何影響。
C 物件的拷貝
在程式設計中,我們有時希望得到現有乙個物件的拷貝。拷貝有兩種 1 淺拷貝 也稱淺表複製 2 深拷貝 也稱深度複製 1.淺拷貝 表示將所有非引用資料型別從乙個物件複製到另乙個物件 如果原有物件包含對像引用,則複製對角引用 即是指當物件的字段值被拷貝時,欄位的引用物件不會被拷貝 形成拷貝後的物件與原物件...
C 拷貝物件
物件的建立中,常常有這樣的需求,就是把物件複製乙份。而複製有三種方法 1.通過初始化來複製 例如 object o1 10 object o2 o1 2.通過賦值來複製 例如 object o1 10 object o2 o2 o1 3.通過預設拷貝函式來複製 例如 object o1 10 obj...
C 中淺拷貝 深拷貝 物件的複製 物件的賦值
一 概念字面理解 1 淺拷貝 發生物件複製時,只是對對像張資料成員進行簡單的賦值。涉及到動態分配問題,如果按淺拷貝進行複製,不做特殊處理,複製完成後,兩個物件中涉及動態分配空間的變數,不管他們各自的空間,及空間中的內容都是完全一樣的,當對這兩個物件進行析構時,會發生同一片空間被釋放兩次,因而會出現錯...