C++浅拷贝和深拷贝的区别

什么时候会使用拷贝构造函数:
当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:
(1)一个对象以值传递的方式传入函数体
(2)一个对象以值传递的方式从函数返回
(3)一个对象需要通过另外一个对象进行初始化。

如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝,位拷贝又称浅拷贝。这只是简单的内存的拷贝,如果是指针,则拷贝指针的地址。

  预防浅拷贝,必须自定义拷贝构造函数,在自定义拷贝构造函数是,必须传递对象的引用,如果传递对象的话,相当于在执行拷贝构造函数,如此会形成一个死循环,所以应该传递对象的引用,这样就避免了重复构造,但引用前也必须加上const这样在拷贝构造函数里就不能够修改传递的对象。

 自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函数,防止浅拷贝,提高源码效率。

浅拷贝和深拷贝
举一个例子,浅拷贝是相当于一个人取了另外的名字,如一个人叫张三,现在改名字叫作李四,对张三或者李四进行操作,还是只对同一个人(相当于针对同一块内存);而深拷贝就是以张三的所有基因为样本,克隆出一个叫李四的人,他们是两个完全独立的人,相互之间改变不会影响对方(相当于两块不同的内存)。这就是深拷贝。

在实际编程的过程中一般都要进行赋值预算符=的重载,如果没有这一过程,编译器会自动进行浅拷贝赋值,这样会影响编程效率。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值