C++類對象的深拷貝、淺拷貝構造函數(shù)

字號:

在學習這一章內容前我們已經(jīng)學習過了類的構造函數(shù)和析構函數(shù)的相關知識,對于普通類型的對象來說,他們之間的復制是很簡單的,例如:
    int a = 10;
    int b =a;
    自己定義的類的對象同樣是對象,誰也不能阻止我們用以下的方式進行復制,例如:
    #include
    usingnamespacestd;
    classTest
    {
    public:
    Test(inttemp)
    {
    p1=temp;
    }
    protected:
    intp1;
    };
    voidmain()
    {
    Test a(99);
    Test b=a;
    }
    普通對象和類對象同為對象,他們之間的特性有相似之處也有不同之處,類對象內部存在成員變量,而普通對象是沒有的,當同樣的復制方法發(fā)生在不同的對象上的時候,那么系統(tǒng)對他們進行的操作也是不一樣的,就類對象而言,相同類型的類對象是通過拷貝構造函數(shù)來完成整個復制過程的,在上面的代碼中,我們并沒有看到拷貝構造函數(shù),同樣完成了復制工作,這又是為什么呢?因為當一個類沒有自定義的拷貝構造函數(shù)的時候系統(tǒng)會自動提供一個默認的拷貝構造函數(shù),來完成復制工作。
    下面,我們?yōu)榱苏f明情況,就普通情況而言(以上面的代碼為例),我們來自己定義一個與系統(tǒng)默認拷貝構造函數(shù)一樣的拷貝構造函數(shù),看看它的內部是如何工作的!
    代碼如下:
    #include
    usingnamespacestd;
    classTest
    {
    public:
    Test(inttemp)
    {
    p1=temp;
    }
    Test(Test &c_t)//這里就是自定義的拷貝構造函數(shù)
    {
    cout<<"進入copy構造函數(shù)"    }
    public:
    intp1;
    };
    voidmain()
    {
    Test a(99);
    Test b=a;
    cout    }
    上面代碼中的Test(Test &c_t)就是我們自定義的拷貝構造函數(shù),拷貝構造函數(shù)的名稱必須與類名稱一致,函數(shù)的形式參數(shù)是本類型的一個引用變量,且必須是引用。
    當用一個已經(jīng)初始化過了的自定義類類型對象去初始化另一個新構造的對象的時候,拷貝構造函數(shù)就會被自動調用,如果你沒有自定義拷貝構造函數(shù)的時候系統(tǒng)將會提供給一個默認的拷貝構造函數(shù)來完成這個過程,上面代碼的復制核心語句就是通過Test(Test &c_t)拷貝構造函數(shù)內的p1=c_t.p1;語句完成的。如果取掉這句代碼,那么b對象的p1屬性將得到一個未知的隨機值;