淺複製和深複製

2022-02-15 11:48:39 字數 2476 閱讀 4453

淺複製:

被複製物件的所有變數都含有與原來的物件相同的值,而其所有的對其他物件的引用都仍然指向原來的物件。

補充:

乙個物件中的字段有的是值型別的,有的是引用型別的。對於值型別字段來說,它的值就是簡單的值,而對於引用型別來說,它的值是位址。

淺複製在複製時,將這個物件的值字段和引用字段(均為非靜態字段)全部複製過去,獲得了這個物件的值和位址。

例子:

基礎類:

public

class person

public

int age

}public

class baseclass

///

/// 引用型別

///

public person p

public baseclass clone()

}

頁面:

public partial class calculate_default : system.web.ui.page

}; baseclass bc2 = bc1;

baseclass bc3 = bc1.clone();

//true

response.write((bc1 == bc2).tostring() + "

"); //false

response.write((bc1 == bc3).tostring() + "

"); //false

response.write((bc2 == bc3).tostring() + "

"); bc1.p.name = "changed";

//changed

response.write(bc1.p.name + "

"); //changed

response.write(bc2.p.name + "

"); //changed

response.write(bc3.p.name + "

"); }

}

深複製:

被複製物件會將所有非引用型別的字段複製給新物件,同時將引用型別所指向位址中存的物件複製給新的物件。

基礎類:

public

class person

public

int age

public person clone()

}public

class baseclass

///

/// 引用型別

///

public person p

///

/// 增加此空建構函式是為了使物件初始化器使用

///

public baseclass()

///

/// 此為內部複製引用型別字段使用,

/// 注意:person類增加了乙個方法

///

///

baseclass(person p)

public baseclass clone()

}

頁面**:

public partial class calculate_default : system.web.ui.page

}; baseclass bc2 = bc1;

baseclass bc3 = bc1.clone();

//true

response.write((bc1 == bc2).tostring() + "

"); //false

response.write((bc1 == bc3).tostring() + "

"); //false

response.write((bc2 == bc3).tostring() + "

"); bc1.p.name = "changed";

//changed

response.write(bc1.p.name + "

"); //changed

response.write(bc2.p.name + "

"); //www

response.write(bc3.p.name + "

"); }

}

區別:

淺複製和深複製的區別僅在於對引用型別的對待上,乙個是複製的位址,乙個是複製的位址指向位置的資料.

淺複製和深複製

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

深複製和淺複製

main.m 深複製和淺複製。created by yaomars on 16 4 27.import 建立乙個nsdictionary,並建立可變副本和不可變副本,說下是深複製還是淺複製。int main int argc,const char argv 第三種方式 建立乙個nsdictionar...