C 物件的拷貝

2021-06-19 16:45:15 字數 1315 閱讀 1880

在程式設計中,我們有時希望得到現有乙個物件的拷貝。

拷貝有兩種:

(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 淺拷貝 發生物件複製時,只是對對像張資料成員進行簡單的賦值。涉及到動態分配問題,如果按淺拷貝進行複製,不做特殊處理,複製完成後,兩個物件中涉及動態分配空間的變數,不管他們各自的空間,及空間中的內容都是完全一樣的,當對這兩個物件進行析構時,會發生同一片空間被釋放兩次,因而會出現錯...