深拷貝與淺拷貝

2021-07-05 00:11:57 字數 959 閱讀 5455

拷貝建構函式是類中的乙個特殊的成員函式,同時拷貝建構函式也是建構函式的一種,其函式名與類名相同,無返回型別,其作用也是為類的成員初始化以及為物件的構造分配儲存空間,不同的是,拷貝建構函式的引數只有乙個,且必須為該類物件的引用。

對於普通型別的物件來說,它們之間的複製是很簡單的,例如:

int a=88;

int b=a; 

而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。 

#include using namespace std;

class cexample

void show ()

cexample(const cexample& c)

void show ()

ca(const ca& c)

void show()

{   cout<深拷貝和淺拷貝的定義可以簡單理解成:如果乙個類擁有資源(堆,或者是其它系統資源),當這個類的物件發生複製過程的時候,這個過程就可以叫做深拷貝,反之物件存在資源,但複製過程並未複製資源的情況視為淺拷貝。

淺拷貝資源後在釋放資源的時候會產生資源歸屬不清的情況導致程式執行出錯

test(test &c_t)是自定義的拷貝建構函式,拷貝建構函式的名稱必須與類名稱一致,函式的形式引數是本型別的乙個引用變數,且必須是引用。

當用乙個已經初始化過了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫,如果你沒有自定義拷貝建構函式的時候,系統將會提供給乙個預設的拷貝建構函式來完成這個過程,上面**的複製核心語句就是通過test(test &c_t)拷貝建構函式內的p1=c_t.p1;語句完成的。

「淺拷貝」與「深拷貝」

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