一、基本概念
建構函式:屬於特殊的類成員函式,為資料成員初始化和分配記憶體。
拷貝建構函式:屬於特殊的建構函式,同乙個類的a物件構造和初始化b物件。
二、什麼時候用拷貝建構函式?
在c++中,拷貝建構函式將會適用在下面三種情況。
1、乙個物件以值傳遞的方式傳入函式。
2、乙個物件以值傳遞的方式從函式返回。
3、乙個物件需要通過另乙個物件進行初始化。
1、乙個物件以值傳遞的方式傳入函式
class rectangle
rectangle(const rectangle& other) //拷貝建構函式
~rectangle() //析構函式
private:
int width;
int height;
};//定義乙個全域性函式func
void func(rectangle rect)
int main()
2、乙個物件以值傳遞的方式從函式返回
class rectangle
rectangle(const rectangle& other) //拷貝建構函式
~rectangle() //析構函式
public:
int width;
int height;
};//定義乙個全域性函式func
rectangle func()
int main()
3、乙個物件需要通過另乙個物件進行初始化
class rectangle
rectangle(const rectangle& other) //拷貝建構函式
~rectangle() //析構函式
private:
int width;
int height;
};int main()
三、淺拷貝/深拷貝
1、淺拷貝
如果在類中沒有宣告拷貝建構函式時,編譯器會自動生成乙個預設的拷貝建構函式。如果類中無指標等動態成員時,我們自定義的拷貝建構函式通常為淺拷貝。
2、深拷貝
類中有指標等動態成員時,就不能簡單地賦值了,而應重新動態分配空間。
原因在於:當類中使用了指標時,兩個物件的析構函式將對p指向的同一塊記憶體空間釋放兩次,導致執行錯誤(編譯器呼叫一次建構函式,兩次析構函式)。
解決辦法就是使用深拷貝,將指標p的位址重新動態分配,但保留指標指向相同的數值。
class rectangle
rectangle(const rectangle& other) //拷貝建構函式
~rectangle() //析構函式
}private:
int width;
int height;
int *p;
};int main()
拷貝建構函式淺拷貝深拷貝
1 函式的引數為類物件且引數採用值傳遞方式 2 將類物件做為函式的返回值。2.淺拷貝 所謂淺拷貝,指的是在物件複製時,只對物件中的資料成員進行簡單的賦值 預設拷貝建構函式執行的也是淺拷貝。大多情況下 淺拷貝 已經能很好地 工作了,但是一旦物件存在了動態成員,那麼淺拷貝就會出問題了,讓我們考慮如下一段...
拷貝建構函式,深拷貝,淺拷貝
深淺拷貝的區別 淺拷貝是將原始物件中的資料型字段拷貝到新物件中去,將引用型字段的 引用 複製到新物件中去,不把 引用的物件 複製進去,所以原始物件和新物件引用同一物件 新物件中的引用型字段發生變化會導致原始物件中的對應欄位也發生變化。line line const line obj 深拷貝是在引用方...
C 拷貝建構函式 深拷貝,淺拷貝
對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 88 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。執行程式,螢幕輸出100。從以上 的執行結果可以看出,系統為物件b分配了記憶體並完成了與物件a的複製過程。就...