对象切割与临时对象

1、判断是copy构造还是copy赋值,不是看是否有赋值操作符=,而是看对象当前是否已经有值了。如果没有值,就是copy构造。如果已经有值了,就是copy赋值。

2、对象赋值的时候,源端与目标端类型不吻合,肯定要进行一次适配(而且只能是一次),中间产生一个临时对象。

3、比如:Person p;  p = 6; copy赋值的时候,要求rhs是个const Person&,显然6不是。因此,这里适配一下,用6构造一个临时对象,然后rhs指向这个临时对象。

  那么接着思考,子类对象赋值给父类对象,会造成对象切割。那么这个过程是否产生临时对象呢?Person p; Student s; p=s;

  那我们分析一下,copy赋值的时候,类型是否吻合。Person& operator=(const Person& rhs) ,显然,rhs可以指向s,类型吻合,因此不产生临时对象。

4、思考一下,copy构造中的形参为什么是引用?Person (const Person& rhs);

  引用可以避免复制对象,这只是表面原因。还有更深层次的原因。考虑,如果copy构造为Person(const Person rhs);

  Person p1 = p2; 调用copy构造,用p2构造rhs,而这个过程有需要调用copy构造,这将导致无限递归下去。

  如果copy构造的形参是指针呢?引用要求右端是个对象,而指针要求右端是个对象地址,copy构造的形参使用指针,它就不是copy构造方法了,而是一个普通的构造方法。

5、注意:传递参数只有两种类型:传值与传引用。传指针本质上也是传值,因为指针本身也是一个类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值