C++ 类(深拷贝和浅拷贝)

文章概述

1.浅拷贝和深拷贝
上一篇文章中,我们提到必要的时候必须手动的写拷贝构造函数。那什么是必要的时候,我们这篇文章分析。


浅拷贝和深拷贝

我们首先要知道默认拷贝构造函数可以完成对象的数据成员简单的复制,这也称为浅拷贝。对象的数据资源是由指针指向的堆时,默认的拷贝构造函数只是将指针复制。
a. 我们首先分析下面的代码为什么会出错??

class Test
{
private:
    int* p;
public:
    Test(int x)
    {
        this->p=new int(x);
        cout << "对象被创建" << endl;
    }
    ~Test()
    {
        if (p != NULL)
        {
            delete p;
        }
        cout << "对象被释放" << endl;
    }
    int getX() { return *p; }
};

int main()
{
    Test a(10);
    //会调用默认的拷贝构造函数
    Test b = a;
    return 0;
}

我们画一个示意图分析:
这里写图片描述
看懂了示意图,我们知道为什么会出错了(同一个内存被释放两次)。我们接下来分析解决方案:

class Test
{
private:
    int* p;
public:
    Test(int x)
    {
        this->p=new int(x);
        cout << "对象被创建" << endl;
    }
    ~Test()
    {
        if (p != NULL)
        {
            delete p;
        }
        cout << "对象被释放" << endl;
    }
    int getX() { return *p; }
    //深拷贝(拷贝构造函数)
    Test(const Test& a)
    {
        this->p = new int(*a.p);
        cout << "对象被创建" << endl;
    }
    //浅拷贝(拷贝构造函数)
    //Test(const Test& a)
    //{
    //  this->p = a.p;
    //  cout << "对象被创建" << endl;
    //}
};

int main()
{
    Test a(10);
    //我们手动的写拷贝构造函数,C++编译器会调用我们手动写的
    Test b = a;
    return 0;
}

总结: 浅拷贝会把指针变量的地址复制; 深拷贝会重新开辟内存空间。

猜你喜欢

转载自blog.csdn.net/wue1206/article/details/81138097