深拷貝與淺拷貝(3)

2022-09-09 04:24:10 字數 1695 閱讀 8658

淺拷貝:簡單的賦值拷貝操作,編譯器提供的拷貝建構函式

深拷貝:在堆區重新申請空間,進行拷貝操作,程式設計師提供

淺拷貝:

如果利用編譯器提供的拷貝建構函式,會做淺拷貝操作。

1 #include 2

using

namespace

std;34

class

person512

13 person(int age,int

height)

1419

20 ~person()

2127 cout << "

person析構函式的呼叫

"<

2930

intm_age;

31int *m_height;  //堆區資料要用指標來接收

3233

};34

35void

test_01()

3645

46int main(void)47

堆區開闢的資料,由程式設計師手動開闢,也要由程式設計師手動釋放。

什麼時候釋放呢?在物件被銷毀之前釋放,物件什麼時候被銷毀呢?程式執行結束之前。程式執行結束之前會呼叫什麼函式呢?析構函式!

析構函式終於排上用場了~~~~

1 #include 2

using

namespace

std;34

class

person512

13 person(int age,int

height)

1419

20 ~person()

2127 cout << "

person析構函式的呼叫

"<

2930

intm_age;

31int *m_height;

3233

};34

35void

test_01()

3645

46int main(void)47

執行上述**,觀察一下:

是什麼原因造成的呢?我們來分析一下:

1

void

test_01()

2

棧區的資料先進後出:編譯器會先執行p2的析構函式,然後再執行p1的析構函式。換句話說:就是堆區的資料已經被p2的析構函式釋放了,p1就沒有許可權

去訪問了!

總結:如果使用淺拷貝的話,會造成堆區的資料重複釋放,系統會報錯。

深拷貝:

專門用來解決淺拷貝帶來的問題。

思路:自己寫自己拷貝建構函式,在拷貝建構函式中重新為 m_height 在堆區開闢乙個空間,這樣問題就解決了。

**實現:

1

//拷貝建構函式

2 person(const person &p)

3

再次執行就沒有問題了。

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝與深拷貝

淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...