例說C 深拷貝與淺拷貝

2021-09-07 22:11:54 字數 1925 閱讀 2973

一開始,先對c#

深拷貝與淺拷貝知識做個簡單的總結。

無論是淺拷貝與深拷貝,c#

都將源物件中的所有字段複製到新的物件中。不過,對於值型別字段,引用型別字段以及字串型別欄位的處理,兩種拷貝方式存在一定的區別(見下表)。

下面給出完整的演示**。

using system;

using system.io;

using system.runtime.serialization;

using system.runtime.serialization.formatters.binary;

namespace deepcloneexp

}; person p1 = p.shallowclone();

person p2 = p.deepclone();

console.writeline("p淺拷貝-->p1;p深拷貝-->p2");

console.writeline("p修改前:p.name=,p.age=,p.job.jobname=", p.name, p.age, p.job.jobname);

console.writeline("p修改前:p1.name=,p1.age=,p1.job.jobname=", p1.name, p1.age, p1.job.jobname);

console.writeline("p修改前:p2.name=,p2.age=,p2.job.jobname=", p2.name, p2.age, p2.job.jobname);

//修改p的所有字段值

p.name = "tiana10000";

p.age = 28;

p.job.jobname = "manager";

console.writeline();

console.writeline("p修改後:p.name=,p.age=,p.job.jobname=", p.name, p.age, p.job.jobname);

console.writeline("p修改後:p1.name=,p1.age=,p1.job.jobname=", p1.name, p1.age, p1.job.jobname);

console.writeline("p修改後:p2.name=,p2.age=,p2.job.jobname=", p2.name, p2.age, p2.job.jobname);}}

[serializable]

class person:icloneable

//值型別字段

public string name //字串

public job job //引用型別字段

//深拷貝

public person deepclone()

}public object clone()

//淺拷貝

public person shallowclone()

}[serializable]

public class job

public override string tostring()}}

執行程式,得到以下結果:

先來看看結果,很明顯,當源物件改變時,副本只有淺拷貝這種情況下的引用型別欄位的值會一起變化,與前面給出的結論一致(不記得的話,麻煩再看一下**)。

對於演示**,僅補充說明: person

類與job

類均需新增標誌[

serializable

],否則執行時會報錯。

好了,就扯到這裡了。

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 ...