如果你重新Operator = 时,注意以下两个事情:
1.令operator= 返回一个指向对象自身的引用
为了方便连锁赋值,如
int x,y,z;
x= y =z;
为了自定义对象也实现同样的效果,必须将赋值操作符返回一个指向自身的引用:
class Widget
{
public:
Widget& operator = (const Widget& rhs)
{
return *this;
}
}
此形式同样适用于“+=”,“-=”“*=”。
2.在operator= 中处理“自我赋值”
自我赋值是程序中容易出现的BUG,并且很多情况下不容易识别。如下所示:
a[i] = a[j];
*px = *py;
自我赋值在以下类似的情况下会出现问题
class Bitmap{...};
class Widget
{
private:
Bitmap* pb;
}
Widget& Widget::Operator = (const Widget& rhs)
{
delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
}
如果此时是自我赋值,则调用delete pb时会直接销毁当前对象的bitmap,同时也销毁了rhs的bitmap.
阻止此问题的方法之一是:
在指向delete前先进行判断:
if(this == &rhs)
return *this;
当然也可以
Widget& Widget::Operator = (const Widget& rhs)
{
Bitmap* pOrig = pb;
pb = new Bitmap(*rhs.pb);
delete pOrig;
return *this;
}
还有一种方法为copy and swap,在此暂不作研究。