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

原创 2013年12月04日 14:07:33

条款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。
  • 确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。   
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【Effective c++】条款11:在operator=中处理“自我赋值”

“自我赋值”发生在对象被赋值给自己: class Widget{...}; Widget w; ... w =w;//赋值给自己  看起来有点蠢,但它合法。赋值动作并不总是那么可被一眼看出来,例如...

Effective c++学习笔记——条款11:在operateor=中自我赋值

Handle assignment to self in operator=            本条款的核心是关于c++对象的自我赋值,既然说是自我赋值,那么就会产生一些你意想不到的问题。首先看...

《Effective C++》item11:在operator=中处理“自我赋值”

“自我赋值”是个看似不可能但却又让人望而生畏的东西,貌似几乎不会有人写出          Point p;          p = p;          这样的二逼程序,虽然不会出现编译错误,但...

Effective C++ 学记之11 在operator=中处理“自我赋值“

确保当对象自我赋值时 operator= 有良好行为。其中技术包括比较“来源对象”和“目标对象”的地址,精心周到的语句顺序,以及copy-and-swap。 确定任何函数如果操作一个以上的对象,而其...

effective c++条款10-12(operator=(重载返回类型、自我赋值和深层复制))整理

一、重载operator=返回类型 下面举例说明,operator=类似。 针对:ostream & operator 说明几点: 1.第一个形参为对ostream对象的引用,在该对象上将产生输出,...

C++中在operator=中处理“自我赋值”(11)---《Effective C++》

**条款11:在**重点内容**operator=中处理“自我赋值”**“自我赋值”发生在对象被赋值给自己时: class Widget{…} Widget w; … w=w;//赋值给自己 ...

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

**如果赋值操作=左右值相等,即自我赋值,传统做法: 证同策略:** 为防止new异常,需要在new之前不删除原先的引用: swap技术的运用: 当传递的是值不是引用时同样可用swap: 注...

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

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

《Effective C++ 》学习笔记——条款11

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

Effective c++学习笔记——条款10:令operator=返回一个*this的引用

Have assignment operators return a reference to *this 从题目,我们就要记住这条信息,让你的operator=函数return *this; 基...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《Effective C++》学习笔记条款11 在operator =中处理“自我赋值”
举报原因:
原因补充:

(最多只允许输入30个字)