C++深拷贝与浅拷贝的区别与实现

    科技2022-09-02  109

    C++深拷贝与浅拷贝的区别与实现

    在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。

    背景:

    如果不主动编写拷贝构造函数与赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数,如果类中含有指针参数,就会隐藏错误:以类String的两个对象来说,假设a.data的内容为 A , b.data的内容为 B 。

    1.两个指针对象会指向同一区域的内存,会彼此影响。 2.将a.data赋值给b.data的时候,b.data原来的内存未被释放,造成内存泄漏。 3.对象在析构释放内存时,data会被释放两次。

    !!!常将 拷贝构造对象语句写为:

    String a(b); //方便区分赋值语句

    构造函数与拷贝构造函数的具体实现:

    //构造函数 Array::Array(int count) { m_iCount = count; m_pArr = new int[m_iCount]; //开辟内存空间 for(int i=0;i<m_iCount;i++) { m_pArr[i] = i; } cout<<"Array"<<endl; } //拷贝构造函数 Array::Array(const Array& arr) { m_pArr = arr.m_pArr; //对象赋值 m_pArr = new int[m_iCount]; //拷贝构造另辟内存空间 for(int i=0;i<m_iCount;i++) { m_pArr[i] = arr.m_pArr[i]; } cout<<"Array &"<<endl; } //析构函数 Array::~Array() { delete []m_pArr; m_pArr = NULL; cout<<"~Array"<<endl; }

     

    Processed: 0.008, SQL: 9