《Effective C++》学习笔记条款11 在operator =中处理“自我赋值”

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

     先举几个自我赋值的例子:
     

     例:Widgetw
           w = w

           a[i] = a[j]; //i == j or i!= j
           *px = *py;// px,py
指向同个地址;
     

以上情况都是对的赋值,但我们涉及对指针引用进行赋值操作的时候,才是我们真正要考虑的问题了。
     

看下面的例子:

     Widget& Widget::operator=(constWidget& rhs) 
  {     

         delete pb;                             //这里对pb指向内存对象进行delete,试想 *this == rhs?情况会如何
         pb = new Bitmap(*rhs.pb);   
 //如果*this == rhs,那么这里还能new吗?大事不妙
         return *this;
 
      }
     

也许以下代码能解决以上问题:
     

Widget& Widget::operator=(const Widget& rhs)
     {
 
        if (this == &rhs) 
        return *this;           //解决了自我赋值的问题。

        delete pb; 
         pb = new Bitmap(*rhs.pb);
 
         return *this;
 
     }

    

     许多时候一群精心安排的语句就可以导出异常安全(以及自我赋值安全)的代码。,以上代码同样存在异常安全

问题。
    

Widget& Widget::operator=(const Widget& rhs)
     {
 
        Bitmap *pOrig = pb;               //记住原先的pb
        pb = newBitmap(*rhs.pb);      //pb指向*pb的一个复本
        delete pOrig;                         //删除原先的pb
         return *this; 
 //这样既解决了自我赋值,又解决了异常安全问题。自我赋值,将pb所指对象换了个存储地址。
     }
 
   
 


      请记住:

  • 确保当对象自我赋值时operator =有良好行为。其中技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及copy-and-swap。
  • 确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。   
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ccwRadar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值