电竞比分网-中国电竞赛事及体育赛事平台

分享

C 類(深拷貝和淺拷貝)

 心本心123 2021-12-08

文章概述

1.淺拷貝和深拷貝
上一篇文章中,我們提到必要的時(shí)候必須手動(dòng)的寫拷貝構(gòu)造函數(shù)。那什么是必要的時(shí)候,我們這篇文章分析。


淺拷貝和深拷貝

我們首先要知道默認(rèn)拷貝構(gòu)造函數(shù)可以完成對象的數(shù)據(jù)成員簡單的復(fù)制,這也稱為淺拷貝。對象的數(shù)據(jù)資源是由指針指向的堆時(shí),默認(rèn)的拷貝構(gòu)造函數(shù)只是將指針復(fù)制。
a. 我們首先分析下面的代碼為什么會出錯(cuò)??

class Test
{
private:
    int* p;
public:
    Test(int x)
    {
        this->p=new int(x);
        cout << '對象被創(chuàng)建' << endl;
    }
    ~Test()
    {
        if (p != NULL)
        {
            delete p;
        }
        cout << '對象被釋放' << endl;
    }
    int getX() { return *p; }
};

int main()
{
    Test a(10);
    //會調(diào)用默認(rèn)的拷貝構(gòu)造函數(shù)
    Test b = a;
    return 0;
}

我們畫一個(gè)示意圖分析:
這里寫圖片描述
看懂了示意圖,我們知道為什么會出錯(cuò)了(同一個(gè)內(nèi)存被釋放兩次)。我們接下來分析解決方案:

class Test
{
private:
    int* p;
public:
    Test(int x)
    {
        this->p=new int(x);
        cout << '對象被創(chuàng)建' << endl;
    }
    ~Test()
    {
        if (p != NULL)
        {
            delete p;
        }
        cout << '對象被釋放' << endl;
    }
    int getX() { return *p; }
    //深拷貝(拷貝構(gòu)造函數(shù))
    Test(const Test& a)
    {
        this->p = new int(*a.p);
        cout << '對象被創(chuàng)建' << endl;
    }
    //淺拷貝(拷貝構(gòu)造函數(shù))
    //Test(const Test& a)
    //{
    //  this->p = a.p;
    //  cout << '對象被創(chuàng)建' << endl;
    //}
};

int main()
{
    Test a(10);
    //我們手動(dòng)的寫拷貝構(gòu)造函數(shù),C++編譯器會調(diào)用我們手動(dòng)寫的
    Test b = a;
    return 0;
}

總結(jié): 淺拷貝會把指針變量的地址復(fù)制; 深拷貝會重新開辟內(nèi)存空間。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多