C++再谈拷贝构造函数。(深拷贝,浅拷贝)

来源:互联网 发布:windows怎么升级win10 编辑:程序博客网 时间:2024/06/10 12:07
  • 类成员、对象成员相关涉及的逻辑(假设坐标类为父类,线段为子类):
如果坐标类含有一个默认构造函数(即不带参数的构造函数),那么它在实例化线段对象的时候可以不使用初始化列表;
如果坐标类要求必须有xy传入,那么从线段类必须有xy传入,并使用初始化列表,当然,如果定义的量不是常量,也可以用一般的参数传递方式。
来自<http://www.imooc.com/video/8137>
  • 拷贝构造函数
    • 浅拷贝:只是将数据成员的值进行拷贝
      例1:这种浅拷贝的实现方式没有问题
      class Array public: Array() { m_iCount = 5; } Array(const Array& arr) { m_iCount = arr.m_iCount;} private: int m iCount; int main(void) Array arrl; Array arr2 = arrl; return O;
      例2:这种浅拷贝的实现方式就有问题了
      class Array public: Array() { m_iCount = 5; m_pArr = new int[m_iCountl;} Array(const Array& arr) { m_iCount = arr.m_iCount; m_pArr = arr.m_pArr;} private: int m iCount; int *m_pArr; int main(void) Array arrl; Array arr2 = arrl; return O;
      这是因为arr1和arr2都指向同一块内存,在写入内存时会产生冲突,例如arr1写入内存后,arr2写入时会覆盖掉原有arr1的内容。或者,arr1释放掉内存后arr2就不能使用了
      arrl m iCount m_pArr OxOOFFOO arr2 m iCount m_pArr
    • 深拷贝
      class Array public: Array() { m_iCount = 5; m_pArr = new Array(const Array& arr){ m iCount = arr.m iCount; m_pArr = new int[m_iCountl; for(int i = O; i < m_iCount; i++) {m_pArr[il = arr.m_pArr[il;}} private: int m iCount; int *m_pArr;
  • 总结:浅拷贝只是拷贝了数据的第一层地址,也就是最直接的地址,如果该地址指向的是一个指针,则会出现指向同一个内存位置的问题。
 
原创粉丝点击