39.C++ 深拷贝与浅拷贝

深拷贝与浅拷贝

深浅拷贝是面试经典问题,也是常见的一个坑

浅拷贝:简单的复制拷贝操作

深拷贝:在堆区重新申请空间,进行拷贝操作

**总结:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题

示例:

#include
#include
using namespace std;
//深拷贝和浅拷贝
class Person
{
public:
    Person()
    {
        cout << "person的默认构造函数调用" << endl;
    }
    Person(int age,int height)
    {
        m_Height = new int (height);
        m_Age = age;
        cout << "person的有参构造函数调用" << endl;
    }

    //自己实现一个拷贝构造函数,解决浅拷贝的问题
    Person(const Person& p)
    {
        cout << "person的拷贝构造函数调用" << endl;
        m_Age = p.m_Age;
        //m_Height = p.m_Height;//编译器默认实现的就是这行代码
        //深拷贝
        //重新开辟一个堆空间,解决浅拷贝的问题
        m_Height = new int(*p.m_Height);
    }

    ~Person()
    {
        //析构代码,将堆区开辟数据做释放操作
        if (m_Height != NULL)//浅拷贝带来的问题就是堆区的内存重复释放
        {                       //浅拷贝的问题要用深拷贝去解决。
            delete m_Height;
            m_Height = NULL;
        }
        cout << "person的析构函数调用" << endl;
    }
    int m_Age;
    int* m_Height;
};
void test01()
{
    Person p1(18,180);
    cout << "p1的年龄为:" << p1.m_Age << "身高为:" << *p1.m_Height << endl;
    Person p2(p1);//如果利用编译器提供的拷贝构造函数,会做浅拷贝参数
    cout << "p2的年龄为:" << p2.m_Age << "身高为:" << * p2.m_Height << endl;
}

int main()
{
    test01();
    return 0;
}

总结:如果成员属性是指针形式,需要开辟堆空间的话,就需要自己写拷贝函数,进行深拷贝,防止浅拷贝重复两次析构问题

你可能感兴趣的:(39.C++ 深拷贝与浅拷贝)