深拷貝與淺拷貝

2022-01-23 10:57:28 字數 1771 閱讀 9383

專案中,經常會遇到要建立乙個物件的副本作為臨時變數或其它用途,需要new乙個新物件出來,

然後把源物件的各個屬性賦值給這個新物件,這樣,及時改變了新物件的屬性,源物件也不會發生改變,即深拷貝。

顯然,硬編碼地把物件的乙個個屬性賦值給另外乙個物件,不僅繁瑣,而且容易出錯,物件的類刪掉乙個屬性,

則這個副本需「減掉」這個屬性。

以employee類為例,下面的**實現了employee的深拷貝與淺拷貝:

employee類:

[serializable]

public

class

employee:icloneable

public

int age

//注意department類要貼上序列化的的標記[serializable],

//因為employee要被序列化,其所有屬性都要可被序列化

public department department

//////

深拷貝

/// ///

public

employee deepclone()

}//////

淺拷貝

/// ///

public

employee shallowclone()

//////

建立當前system.object的淺表副本

/// ///

public

object

clone()

}

view code

department類:

[serializable]

public

class

department

public

override

string

tostring()

}

view code

main方法:

static

void main(string

args)

};//淺拷貝

//employee emp2 = emp1.shallowclone() as employee;

//深拷貝

employee emp2=emp1.deepclone() as

employee;

//修改emp2,emp1的各個屬性不會被修改

emp2.idcode = "

10087";

emp2.age = 24

; emp2.department.name= "

研發部"

;

//輸出驗證

console.writeline("

編號:,部門:,年齡:

",emp1.idcode,emp1.department,emp1.age);

console.writeline(

"編號:,部門:,年齡:

", emp2.idcode, emp2.department, emp2.age);

console.readkey();

}

view code

執行截圖:

總結:emp2為emp1深拷貝的副本,修改emp2的屬性,emp1的屬性不會改變。

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝與深拷貝

淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...