operator=的一些知识

10、operator=返回一个引用指向操作符=左边的实参。
x=y=z=5这种连续赋值的问题,其实采用的是右结合律。先让z=5,然后传递到左边。
这个时候,=就必须可以返回一个引用。比如z=5,最右边的等号会返回z的引用,也就是5.
当然,也可以不返回引用,返回用z初始化的临时对象,,再执行y= z的临时对象.这样会调用构造函数和析构函数,需要代价。
所以,一般最好知道等号会返回一个引用,指向等号左边的实参。

2、等号处理自我赋值问题
比如:
class W(…);
W w;

w=w;

这一愚蠢的动作通常不是一眼能看出来。比如:a[i]=a[j]当i=j时就是自我赋值。比如*px=*py,当二者指向同一内容时就是自我赋值。这是由于别名的影响。甚至不同类型的名字也可能是别名,比如基类的指针或引用可以指向派生类的对象。

如果你自行管理资源,有可能出现自己的指针指向的是一个被删除的对象.

那么解决自我赋值安全性的一个方法就是证同测试。也就是先判断等号两边是否是同一对象,是的话就不操作。

然而,证同测试并没有解决异常安全性(比如分配时内存不足),所以,我们把焦点放在异常安全性时往往会实现自我赋值安全性。还有一种copy swap技术,把this指针和目标对象副本直接交换。

3、复制对象时勿忘其每一部分
如果你不想用编译器自己的复制构造函数和赋值操作符,就需要自己写。那么就要注意两点:
1.如果你为class增加了成员变量,那么必须修改copying函数,不修改是不会报错的。
2、在继承时,派生类的copy函数还需要调用基类的copy函数才可以。不然的话基类部分的成员变量就无法复制。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值