自我赋值
自我赋值的行为即对象将值赋给自己:
class Widget {...};
Widget w;
...
w = w;
注意,这是一个合法的赋值, 虽然不经常发生,而且这样的赋值并不总是能被很明显的看出来,比如:
a[i] = a[j];
or
*px = *py;
假设你建立一个class用于保存一个指针指向一块动态分配的位图:
class Bitmap {...};
class Widget
{
...
private:
Bitmap* pb;
};
下面我们重载等于运算符:
Widget& Widget::operator=(const Widget& rhs)
{
delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
}
当前的问题在于, 等号两边的值可能是同一个对象, 这样当前对象的bp被delete掉时, 传入对象也相应的被delete掉了,想要阻止这样的错误, 我们可以在处理前做一个检查:
Widget& Widget::operator=(const Widget& rhs)
{
if(this == &rhs)
{
return *this;
}
delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
}
如果检查到是自我赋值的话,就什么也不做直接返回。
我们还可以做的就是在复制pb所指向的东西之前不要删除pb:
Widget& Widget::operator=(const Widget& rhs)
{
bitmap* pOrig = pb;
pb = new Bitmap(*rhs.pb);
delete pOrig;
return *this;
}