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

2021-10-08 07:54:02 字數 1211 閱讀 3083

#include

using

namespace std;

/* 淺拷貝和深拷貝區別

1.淺拷貝,若類中不存在拷貝建構函式,會提供預設拷貝建構函式(淺拷貝),可以進行物件值賦值;

但當資料成員中存在需要在堆區申請空間時,析構時淺拷貝會造成空間雙重釋放問題;

2.深拷貝,當資料成員中存在需要在堆區申請空間時,會呼叫深拷貝,重新申請新的空間,可以避免析構時堆區空間被多次釋放問題;

*/class

person

~person()

cout<<

"person析構函式"

<

}private

:int m_age;

char

*m_pname;};

void

test()

intmain()

執行時,會報錯,因為m_pname堆區空間被兩次釋放,淺拷貝時直接將per成員的m_age和m_pname值賦值給per1的成員,per和per1的m_pname指向同乙個空間,物件生命週期接收時,先釋放per1物件m_pname空間,再次釋放per的m_pname空間,導致多次釋放報錯;

//深拷貝

person

(const person &per)

~person()

cout<<

"person析構函式"

<

}private

:int m_age;

char

*m_pname;};

void

test()

intmain()

正常釋放空間,因為person per1(per),會呼叫深拷貝建構函式,per1中的m_pname成員在堆區重新申請了空間,per和per1物件的m_pname都有各自的空間,析構時釋放的也是自己的空間,不會造成多處釋放或未釋放問題;

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

深拷貝函式主要是解決拷貝函式不能直接拷貝指標所指記憶體的資料的問題 其次,介紹一下什麼是拷貝建構函式以及拷貝建構函式將在何時被呼叫?拷貝建構函式是一種特殊的建構函式,其形參是本類物件的引用,其作用是使用乙個已經存在的物件來初始化 乙個新的同類的物件。何時被呼叫?當用類的物件去初始化另外乙個物件的時候...

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

一.拷貝建構函式 先直接來看 include include help.h using namespace std class line private char msg line line const char msg line line const line line line line voi...

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

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