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

  • 类成员、对象成员相关涉及的逻辑(假设坐标类为父类,线段为子类):
如果坐标类含有一个默认构造函数(即不带参数的构造函数),那么它在实例化线段对象的时候可以不使用初始化列表;
如果坐标类要求必须有xy传入,那么从线段类必须有xy传入,并使用初始化列表,当然,如果定义的量不是常量,也可以用一般的参数传递方式。
  • 拷贝构造函数
    • 浅拷贝:只是将数据成员的值进行拷贝
      例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;
  • 总结:浅拷贝只是拷贝了数据的第一层地址,也就是最直接的地址,如果该地址指向的是一个指针,则会出现指向同一个内存位置的问题。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值