C 中的深複製和淺複製

2022-04-07 01:37:17 字數 1523 閱讀 8662

c# 支援兩種型別:「值型別」和「引用型別」。

值型別(value type)(如 char、int 和 float)、列舉型別和結構型別。

引用型別(reference type) 包括類 (class) 型別、介面型別、委託型別和陣列型別。

如何來劃分它們?

以它們在計算機記憶體中如何分配來劃分

值型別與引用型別的區別?

1,值型別的變數直接包含其資料,

2,引用型別的變數則儲存物件引用。

對於引用型別,兩個變數可能引用同乙個物件,因此對乙個變數的操作可能影響另乙個變數所引用的物件。對於值型別,每個變數都有自己的資料副本,對乙個變數的操作不可能影響另乙個變數。

值型別隱式繼承自system.valuetype  所以不能顯示讓乙個結構繼承乙個類,c#不支援多繼承

堆疊(stack)是一種後進先出的資料結構,在記憶體中,變數會被分配在堆疊上來進行操作。

堆(heap)是用於為型別例項(物件)分配空間的記憶體區域,在堆上建立乙個物件,

會將物件的位址傳給堆疊上的變數(反過來叫變數指向此物件,或者變數引用此物件)。

關於物件轉殖的所設計到知識點

淺拷貝:是指將物件中的所有字段逐字複雜到乙個新物件

對值型別字段只是簡單的拷貝乙個副本到目標物件,改變目標物件中值型別欄位的值不會反映到原始物件中,因為拷貝的是副本

對引用型字段則是指拷貝他的乙個引用到目標物件。改變目標物件中引用型別欄位的值它將反映到原始物件中,因為拷貝的是指向堆是上的乙個位址

深拷貝:深拷貝與淺拷貝不同的是對於引用欄位的處理,深拷貝將會在新物件中建立乙個新的物件和

原始物件中對應字段相同(內容相同)的字段,也就是說這個引用和原始物件的引用是不同, 我們改變新

物件中這個欄位的時候是不會影響到原始物件中對應欄位的內容。

淺複製: 實現淺複製需要使用object類的memberwiseclone方法用於建立乙個淺表副本

深複製: 須實現 icloneable介面中的clone方法,且需要需要轉殖的物件加上[serializable]特性

class drawbase:system.object , icloneable

public object clone()

}class program

}執行結果:

return this as object;      //引用同乙個物件

輸出:jmj

a9fs3

ljtrue

return this.memberwiseclone(); //淺複製

return new drawbase() as object;//深複製

輸出均為: jmj

jmjjmj

false

解釋:return this as object 方法總是引用同乙個物件,因此相應的堆記憶體上的值會改變!

後兩種方法都是對物件的複製,區別在於複製的類別不同:深複製會複製整個填充的物件,包括該物件中其他引用型別和值型別的值;而淺複製只複製了乙個物件中所有引用,它沒有值的複製,通過引用它們的其他物件的引用來共享它們。

C 中深複製和淺複製

c 支援兩種型別 值型別 和 引用型別 值型別 value type 如 char int 和 float 列舉型別和結構型別。引用型別 reference type 包括類 class 型別 介面型別 委託型別和陣列型別。如何來劃分它們?以它們在計算機記憶體中如何分配來劃分 值型別與引用型別的區別...

淺複製和深複製

在c 中,下面三種物件需要呼叫拷貝建構函式 有時也稱 複製建構函式 1 乙個物件作為函式引數,以值傳遞的方式傳入函式體 全域性函式,傳入的是物件 void g fun resume c 2 乙個物件作為函式返回值,以值傳遞的方式從函式返回 全域性函式 返回的是物件 resume g fun 3 乙個...

深複製和淺複製

以下 是否完全正確,執行可能得到的結果是 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class a class b b void sayhello b b int main 程式正常執行 程式編譯錯誤 程式崩潰 程式死迴圈 這個程式會直接崩潰 voidsayhello ...