jake1036

赋值操作符相关

                                             赋值操作符相关

  一 令operator = 返回一个reference * this

1  先看一个遵循的标准协议
    
class Widget
{
  
public :
    Widget::
operator=(const Widget & rhs)
    


      
return * this ; //返回一个左侧对象
    }


}


 2 不光适用于标准形式,也适应于所有的赋值操作
    比如适应于 += , -= ,*= 
    
   综上: 令赋值操作符返回一个reference to * this 。



 二 在operator= 中处理 自我赋值

  考虑下面的代码:
  

Widget & Widget::operator=(const Widget & rhs)
{
  delete pb ; 
  pb 
= new Bitmap(*rhs.pb) ; 
  
return * this ;
}

 上述代码有一个问题,当实现自我赋值的时候,pb对象已经被删除,此时又根据pb对象创建一个新的对象,造成错误。

 解决方法一:
  在删除之前添加一个证同测试:
  代码如下:
 

Widget & Widget::operator=(const Widget & rhs)
{
  
if(&rhs == this)
    
return *this;
  
  delete pb ;
  pb 
= new Widget(rhs.pb) ; //此处发生错误
  return *this ; 
}

 但是上述代码若new 代码处发生异常,则很可能导致返回一个指向已删除内存区域的指针。

解决方法2:
可以先创建一个新的pb,然后再对旧pb进行删除。

Widget & Widget::operator=(const Widget & rfs)
{
  
if(this == &rfs)
    
return *this ;   
   Bitmap 
* ptr = pb ;
   pb 
= new Bitmap(rfs.pb);
   delete ptr ;
   
return *this;
}


解决方法3:
  使用copy and swap 技术
 
  


void swap(Widget & rhs)

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







 

posted on 2011-05-06 22:22 kahn 阅读(248) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理