C 中拷貝建構函式及深拷貝和淺拷貝

2021-09-30 11:29:06 字數 844 閱讀 8437

1、拷貝建構函式

先看個簡單的例子:

#includeusing namespace std

class test

void print()

2、深拷貝和淺拷貝

在某些情況下(如果類中包含了指標),類內成員變數需要動態開闢堆記憶體,如果實行位拷貝(即淺拷貝),也就是把物件裡的值完全複製給另乙個物件,如obj1=obj,這時,如果obj中有乙個成員變數指標已經申請了記憶體,那obj1中的那個成員變數也指向同一塊記憶體。這就出現乙個問題:當把obj記憶體釋放了(如析構),這時obj1內的指標就是野指標了,出現執行錯誤。

為了解決這個問題,我們可以採用深拷貝方式,就是對資源進行重新分配,如下示列:

#include using namespace std;

class test

test(const test& c)

void show()

{   cout<

3、總結

淺拷貝就是物件的資料成員之間的簡單複製。如果設計乙個類而沒有自定義拷貝建構函式,當用乙個物件去給另乙個物件賦值所執行的過程就是淺拷貝;

如果物件中沒有其他的資源(如堆,檔案,系統資源等)時,深拷貝和淺拷貝沒有什麼區別。但是如果物件中有動態分配記憶體的成員變數時,就需要深拷貝了,需要另外開闢一塊新的資源進行複製。

深拷貝和淺拷貝的區別是在物件狀態中包含其它物件的引用的時候,當拷貝乙個物件時,如果需要拷貝這個物件引用的物件,則是深拷貝,否則是淺拷貝。

淺拷貝就是對物件成員簡單的複製,複製後的成員變數所指向的記憶體位址是相同的,而深拷貝是在記憶體中重新開闢乙個空間來存放原來物件的成員變數,其記憶體位址是不同的。

C 拷貝建構函式 淺拷貝和深拷貝

建構函式可以沒有,也可以有多個。複製建構函式只有乙個,不定義編譯器自動生成,使用者寫就使用自定義的複製建構函式 物件之間的複製語句不會呼叫複製建構函式。利用編譯器提供的拷貝建構函式,會做淺拷貝 淺拷貝帶來的問題就死堆區記憶體的重複釋放 案例1 class student student 程式正常輸出...

C 拷貝建構函式 深拷貝,淺拷貝

對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 88 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。執行程式,螢幕輸出100。從以上 的執行結果可以看出,系統為物件b分配了記憶體並完成了與物件a的複製過程。就...

C 拷貝建構函式 深拷貝,淺拷貝

對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 88 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。include using namespace std class cexample void show 執...