出自:http://blog.tianya.cn/blogger/post_show.asp?blogid=1368948&postid=11821757
我們知道建立物件時常使用new操作符,還有一種方法就是建立乙個已知物件的副本或轉殖.被轉殖的物件可以是類例項、陣列或任何引用型別,但不能轉殖基本型別。可轉殖的類必須實現iclonable介面。
淺拷貝建立原物件型別的乙個新例項,然後將原物件的非靜態字段複製到新物件,對於引用型別字段,則只複製該值的指標。深拷貝則複製所有字段,它會建立引用物件的副本,並在副本中提供這些物件的引用。下面是乙個淺拷貝的**:
using system;
using system.collections.generic;
using system.text;
namespace shallow
;public int age;
public string name;
public test(string myname,string myage)
public object clone()
public static void main(string args)
", test1.s[0]);
console.writeline("test2.s[0]=", test2.s[0]);
console.writeline("test1.age=", test1.age);
console.writeline("test2.age=", test2.age);
console.writeline("test1.name=", test1.name);
console.writeline("test2.name=", test2.name);}}
}輸出結果是:
test1.s[0]=0
test2.s[0]=0
test1.age=20
test2.age=22;
test1.name=shallow1
test2.name=shalow2
從這個結果我們可以看出對副本的改變並不改變原來的物件,但對引用欄位的改變確改變了原物件中的值。對於深拷貝的情況,對副本的改變不管是不是引用欄位都不會影響原物件中的值。
c 中深拷貝與淺拷貝
如果沒有自定義複製建構函式,則系統會建立預設的複製建構函式,但系統建立的預設複製建構函式只會執行 淺拷貝 即將被拷貝物件的資料成員的值一一賦值給新建立的物件,若該類的資料成員中有指標成員,則會使得新的物件的指標所指向的位址與被拷貝物件的指標所指向的位址相同,delete該指標時則會導致兩次重複del...
C 中的淺拷貝與深拷貝
用自定義的string類解釋什麼是淺拷貝什麼是深拷貝。class string 淺拷貝是在呼叫拷貝函式時進行了值拷貝,這樣的拷貝看似沒有問題,在呼叫析構函式時會導致記憶體洩漏,系統奔潰。define crt secure no warnings 1 includeusing namespace st...
C 中的深拷貝與淺拷貝
1 拷貝建構函式 定義 如果乙個類的建構函式的第乙個引數是類自身類型別的引用,且任何額外引數都有預設值,則此建構函式為拷貝建構函式。由此可見,拷貝建構函式是一種特殊的建構函式,乙個類可以有多個拷貝建構函式,既可以是public的,也可以是private的 特殊用法,如設計模式中的單例模式需要將拷貝建...