C 容器之淺拷貝與深拷貝

2021-10-02 23:29:01 字數 1612 閱讀 7809

二 深拷貝

淺拷貝不開闢新空間,只增加乙個指標,指向原有的記憶體。

//析構函式

~person()

}private

:char

* mname;

//指標 容易淺拷貝的問題

int mage;};

void

test01()

intmain

(void

)程式執行出錯:

因為,發生了淺拷貝,p 和 vperson兩個物件指標指向同一塊記憶體空間,析構時候,會析構兩次,因此報錯。

深拷貝會開闢新的記憶體空間,把原有的物件複製過來。見下圖:

拷貝建構函式

拷貝建構函式是一種特殊的建構函式,遵循如下的規則:

1.函式名和類名一致,沒有返回值。

2.必須有乙個引數,引數是本型別的乙個引用變數。

3.拷貝建構函式可以訪問引數物件的任意成員(private也可以)。

4.若自己不提供拷貝建構函式,系統會提供預設建構函式,若自己定義,系統將不再提供。

5.系統提供的拷貝構造是淺拷貝

新增拷貝建構函式後

#define _crt_secure_no_warnings

#include

#include

using

namespace std;

class

person

person

(const person& p)

person&

operator=(

const person& p)

this

->mname =

newchar

[strlen

(p.mname)+1

];strcpy

(this

->mname, p.mname)

;this

->mage = p.mage;

cout <<

"operator = "

<< endl;

}//析構函式

~person()

}private

:char

* mname;

//指標 容易淺拷貝的問題

int mage;};

void

test01()

intmain

(void

)

C 之淺拷貝與深拷貝

當我們對類或者結構體進行賦值操作的時候,會呼叫拷貝建構函式,這時會涉及到淺拷貝和深拷貝的問題。一 淺拷貝 所謂淺拷貝就是對資料成員進行簡單的一一拷貝,因此,對於指標變數也只是拷貝了指標本身,當拷貝完成之後,兩個指標會指向同一塊記憶體,所以當呼叫兩次析構函式的時候,該記憶體會被釋放兩次,從而造成指標懸...

C 之深拷貝 淺拷貝

關於拷貝的錯誤 對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式 拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。以下有乙個學生類 執行結果 呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,這會導致什麼問題呢?name指標被分配一次記憶體,但是程式結...

C 之深拷貝 淺拷貝

什麼是拷貝建構函式?通過拷貝物件的方式建立乙個新的物件,拷貝建構函式的引數必須是類物件的引用,也就是將乙個物件拷貝給另乙個新建的物件 用途,在建立物件的時候,使用同一類之前建立的物件來初始化新建立的物件 book book b 必須是引用的原因是,如果是傳值方式將實參傳遞給形參,中間要經歷乙個物件的...