淺拷貝與深拷貝

2021-06-28 13:10:35 字數 738 閱讀 7991

淺拷貝

1 2  myclass a,b; 

a=b;  

為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員、指標變數。

類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部動態建立的記憶體塊,比如用new和malloc申請的記憶體,一般為陣列或讀取的檔案資料流。

如果類中只有int、double、char、bool這類基本型別的變數,由於基本變數的所佔空間是已知的,所以在編譯時編譯器就可確定所需記憶體大小而進行分配(靜態分配記憶體),物件a和物件b他們的變數存在於各自的記憶體塊中(物件記憶體空間),淺拷貝後a的所有變數都被拷貝,如果a中的變數值被修改不會影響b內的變數值。

但假如這個類是個含有乙個指標變數p,其中b物件在執行時分配了塊記憶體(比如動態建立了陣列,或讀取了檔案資料流,即動態分配記憶體),p指向該記憶體,淺拷貝後,a的p被賦值,因此同樣指向該記憶體塊,也就是說a的指標p指向了b的指標p指向的記憶體。這就存在乙個問題,兩個物件的指標都指向一塊記憶體,如果通過a的指標p修改資料,顯然就會使得b內的資料也受到影響,這不符合解耦原則而破壞了物件的封裝性。

深拷貝由於上述原因,c++提供了拷貝建構函式介面以及賦值操作符過載函式介面,以便開發者處理動態分配的記憶體的複製工作,這類複製工作就叫深拷貝。

class myclass 

淺拷貝是系統自動呼叫的預設賦值操作符過載函式實現,而深拷貝需要開發者實現。

「淺拷貝」與「深拷貝」

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

「淺拷貝」與「深拷貝」

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

深拷貝與淺拷貝

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