条款11:在operator=中处理“自我赋值”

结论1:确保当对象自我赋值时operator=有良好行为,其中技术包括比较“来源对象”和“目标对象"的地址(证同测试)、精心周到的语句顺序、以及copy-and-swap。

例如:

class Bitmap { ... };
class Widget {
...
private:
Bitmap* pb;
};

证同测试:

Widget& Widget::operator= (const Widget& rhs) {
if (this == &rhs) return *this;
delete pb;
pb = new Bitmap(*rhs.pb);//具备了”自我赋值安全性“,但不具备”异常安全性“,如果”new Bitmap“导致异常,Widget最终会持有一个指针指向一块被删除的Bitmap。
return *this;
}

精心周到的语句顺序:

Widget& Widget::operator= (const Widget& rhs) {
Bitmap* pOrig = pb;//对原bitmap做了一份复件,不但确保了”异常安全“而且确保了”自我赋值安全”
pb = new Bitmap(*rhs.pb);
delete pOrig;
return *this;
}

copy-and-swap技术:

class Widget {
...
void swap(Widget & rhs);
...
};
Widget& Widget::operator= (const Widget& rhs) {
Widget temp(rhs);
swap(temp);
return *this;
}

考虑到函数以by value方式传递参数时会造成一份副本,可以采用如下方法:

Widget& Widget::operator=(Widget rhs){
swap(rhs);
return *this;
}
结论2:确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值