C 拷貝建構函式(淺拷貝 深拷貝)

2022-08-05 06:09:15 字數 1922 閱讀 4537

下面舉乙個簡單的例子說明物件之間的拷貝(此例中沒有自定義拷貝建構函式,在呼叫拷貝建構函式的時候,編譯器會自動生成乙個預設的拷貝建構函式,該建構函式完成物件之間的位拷貝)淺拷貝:

#include

using namespace std;

class cexample

private:

int a;

public:

cexample(int b)

a=b;

void show()

coutcexample a(100);

cexample b=a;

b.show();

return 0;

輸出結果:

100系統為物件b分配了記憶體並完成了與物件a的複製過程。形同型別物件是通過拷貝建構函式來完成整個過程的。

自定義建構函式(自定義拷貝建構函式是一種良好的程式設計風格,他可以組織編譯器形成預設的拷貝建構函式,提高原始碼效率):

示例:#include

using namespace std;

class cexample

private:

int a;

public:

cexample(int b)

a=b;

cexample(const cexample& c)

a=c.a;

void show()

coutcexample a(100);

cexample b=a;

b.show();

return 0;

輸出結果:

當乙個已經初始化的自定義型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫。也就是說,當類的物件需要拷貝時,拷貝建構函式將會被呼叫。一下情況都會呼叫拷貝建構函式:

淺拷貝和深拷貝詳解

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

兩種拷貝方式可以簡單的理解為:如果乙個類擁有資源,當這個類的物件發生複製過程的時候,資源重新分配,這個重新分配的的過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝。

下面舉例說明深拷貝:

#include

using namespace std;

class ca

private:

int a;

char* str;

public:

ca(int b,char* cstr)

a=b;

str=new char[b];

strcpy(str,cstr);

ca(const ca& c)

a=b;

str=new char[a];

if(str!=0)

strcpy(str,c.str);

void show()

cout<~ca()

delete str;

str=0;

void main()

ca a(10,"hello");

ca b=a;

b.show();

return 0;

輸出結果:

hello

上面的示例可以看出,首先初始化乙個ca物件之後,在進行自定義拷貝建構函式把a中的變數str拷貝給物件b,在此之中,a可能會呼叫析構函式delete str操作,使得str變數的位址**,如果在自定義拷貝建構函式中進行深拷貝操作,物件a析構釋放資源後可能導致資源歸屬不清的情況而導致程式執行錯誤。深拷貝會在拷貝的時候重新給str分配記憶體單元,這樣就可以在不出錯的情況下獨立操作b中的變數。

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

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

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