淺拷貝:簡單的賦值拷貝操作,編譯器提供的拷貝建構函式
深拷貝:在堆區重新申請空間,進行拷貝操作,程式設計師提供
淺拷貝:
如果利用編譯器提供的拷貝建構函式,會做淺拷貝操作。
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棧區的資料先進後出:編譯器會先執行p2的析構函式,然後再執行p1的析構函式。換句話說:就是堆區的資料已經被p2的析構函式釋放了,p1就沒有許可權void
test_01()
2
去訪問了!
總結:如果使用淺拷貝的話,會造成堆區的資料重複釋放,系統會報錯。
深拷貝:
專門用來解決淺拷貝帶來的問題。
思路:自己寫自己拷貝建構函式,在拷貝建構函式中重新為 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...