一般我們來說,淺拷貝指的是將a物件記憶體中的資料按位拷貝到b物件中,這樣的拷貝方式適用於一般的資料型別的拷貝,或者物件的型別比較簡單的類的拷貝。
比如:
//一般的資料型別
int a =1;
int b = a;
// 簡單的類
classa;
intmain()
但是當類的內容比較複雜,比如有指標或者有動態分配放入記憶體時,這種淺拷貝的方式就會出錯。比如:
class
stu~
stu(
)stu
(int age,
int* number)
:mnumber
(number)
,mage(0
)void
setnumber
(int num)
;void
displaynumber()
;private
:int mage;
int* mnumber;};
void stu::
setnumber
(int num)
void stu::
displaynumber()
intmain()
上面這段**中啊的mnumber指標拷貝給b,但是記憶體中的資料並沒有多拷貝乙份,這樣就導致a,b兩個物件中的指標都指向同一塊記憶體,改變其中乙個指標指向的記憶體,另乙個物件也會隨之改變。
因此,就需要我們自己封裝乙個能夠新分配一段記憶體給新的物件的在這裡插入**片
函式,就由此引出了深拷貝。深拷貝就是顯式定義拷貝建構函式使得新的物件能夠擁有乙份和之前的物件內容一致的記憶體。請看下面修正:
class
stustu
(int age,
int* number)
:mnumber
(number)
,mage(0
)stu
(stu& stu)
~stu()
void
setnumber
(int num)
;void
displaynumber()
;private
:int mage;
int* mnumber;};
void stu::
setnumber
(int num)
void stu::
displaynumber()
intmain()
加上顯式的拷貝構造函後,每次拷貝都會new出一塊新的記憶體,就不會出現淺拷貝的問題了。
以下情況都會呼叫拷貝建構函式:
乙個物件以值傳遞的方式傳入函式體
乙個物件以值傳遞的方式從函式返回
乙個物件需要通過另外乙個物件進行初始化。
C 淺拷貝和深拷貝
class test test const test t val new int t.val test private int val 現在定義兩個物件,test t1 9 test t2 t1 如果你不提供copy建構函式 注釋掉的那個 那麼t1和t2的成員 val指向同乙個物件,當析構的時候,同...
c 深拷貝和淺拷貝
深拷貝和淺拷貝 ca const ca c 就是我們自定義的拷貝建構函式。可見,拷貝建構函式是一種特別的建構函式,函式的名稱必須和類名稱一致,他的唯一的乙個引數是本型別的乙個引用變數,該引數是const型別,不可變的。例如 類x的拷貝建構函式的形式為x x x 當用乙個已初始化過了的自定義類型別物件...
c 深拷貝和淺拷貝
對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 88 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。iostream using namespace std class cexample void show ...