解析c/c++深拷贝和浅拷贝

1.在给对象赋值时会调用类的复制构造函数,如果自己没有定义复制构造函数,那么编译器会自动为你生成一个复制构造函数。

2.什么是复制构造函数:

class A{
 public:
    A();//无参构造函数
    A(const A &instance);//复制构造函数
    ……
}

3.浅拷贝:只是将一个对象的所有成员的值都简单的赋给新的对象,默认的复制构造函数就是采用的这种方法进行赋值。

4.深拷贝:用一个对象为另一个对象赋值时,遇到指针这些成员时不是简单地将指针指向的地址赋给新对象中的相应的指针成员,而是为新对象开辟一个新的内存空间,然后再让新对象中的相应的指针成员指向新开辟的内存空间,而浅拷贝中新对象的指针成员与原来的对象的相应指针成员指向同一个地址。

5.深拷贝的简单例子:

class A{
private:
   int i;
   int *j;
   ……
public:
    //复制构造函数
    A(const A &instance){
    this.i=instance.i;
    int tmp=*(instance.j);
    this.j=&tmp;
    ……
    }
……
}


6.什么时候需要自己定义复制构造函数来实现深拷贝。

如果你没有为上面的例子写复制构造函数,那编译器给你自动生成的构造函数应该是这样子的

A(const A &instance){
     this.i=instance.i;
     this.j=instance.j;
     ……
}


这样的话就是浅拷贝,当在instance中将j所指向的内存释放后,新对象中成员j指向的就是未定义的区域或者说是无效的,那么就会发生运行时异常。所以当你自己定义的类中有指针成员或者动态开辟内存的数据成员的时候就需要自己定义复制构造函数,实现对象的深拷贝功能。


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值