深拷貝和淺拷貝

拷貝構造函數:首先是一個構造函數,特殊在只有一個參數且用對象的引用作參數(規定),函數體是一些賦值語句

淺拷貝:對對象中的數據成員簡單賦值,默認拷貝就是淺拷貝,分系統默認和手寫的

深拷貝:對象存在動態成員,也就是自己在堆中申請了一塊內存空間(C++中用new申請)一定是自己寫的:對一些放在棧中的成員變量(普通變量)賦值,手動申請一個和構造函數中手動申請的一塊內存空間(堆中)相同大小的內存空間並賦值

例如:深拷貝


#include<IOSTREAM.H>
class Rect
{
public:
    Rect()      // 構造函數,p指向堆中分配的一空間
    {
        p = new int(100);
    }
    Rect(const Rect& r)
    {
        width = r.width;
        height = r.height;
        p = new int;    // 爲新對象重新動態分配相同大小的空間,只是它的值不一定是100
        *p = *(r.p);//賦值
    }
    ~Rect()     // 析構函數,釋放動態分配的空間
    {
        if(p != NULL) 
        {
            delete p;
        }
    }
public:
    int width;
    int height;
    int *p;     // 一指針成員
};
int main()
{
    Rect* rect1=new Rect;
    Rect rect2(rect1);   // 複製對象
    cout<<(rect1.p)<<" "<<(rect2.p)<<endl;//輸出100 100 說明對象rect1 ,rect2一樣
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章