• 深拷贝与浅拷贝


    #if 1

    #include <iostream>
    using namespace std;

    //深拷贝与浅拷贝
    class Person
    {
    public:
        Person()
        {
            cout << "Person默认构造函数调用" << endl;
        }

        Person(int age, int hight)
        {
            m_Age = age;
            //如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题。
            m_Height = new int(hight);
            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, 160);
        cout << "p1的年龄为:" << p1.m_Age << ",身高为:" << *p1.m_Height<< endl;

        Person p2(p1);//如果利用编译器提供的拷贝构造函数,会做浅拷贝操作。带来的问题是堆区的问题重复释放。
        //要利用深拷贝来解决

        cout << "p2的年龄为:" << p2.m_Age << ",身高为:" << *p2.m_Height << endl;
    }

    int main()
    {
        test01();
        system("pause");
        return 0;
    }

    #endif

  • 相关阅读:
    回溯算法集合(全排列,组合,子集)
    ARM 汇编伪指令
    大麦网-演出赛事票务系统画uml图
    员工如何在小程序中进行打卡
    数据治理:误区梳理篇
    ant design Pro中 initialState的使用方法
    Ansible 指定受控端使用Python的版本
    网络安全——终端安全
    axios介绍以及对axios进行二次封装
    如何进行编译和链接操作?
  • 原文地址:https://blog.csdn.net/WOSHIZHOUWANLI/article/details/125629651