一,在operator=中处理自我赋值
class Bitmap{...};
class Widget{
private:
Bitmap *p;
public:
Widget& operator=(const Widget& rhs){
delete p;
p = new Bitmap(*rhs.p);
return *this;
}
};
Widget w;
w = w;
上面的operator=实现代码,在进行自我赋值时会出现问题。在进行自我赋值时*this与rhs是同一个对象,this->p与rhs.p指向的是同一块内存空间,delete p操作释放掉this->p指向的内存空间,此时rhs.p指向的内存空间是空的,但p = new Bitmap(*rhs.p)使用rhs.p这个指向空内存的指针创建Bitmap对象,这样做会导致编译错误。下面的两种方法可以阻止这种错误
1,使用证同测试来阻止上面的错误
Widget& Widget::operator=(const Widget& rhs){
if(this == &rhs){ //证同测试
return *this;
}
delete p;
p = new Bitmap(*rhs.p);
return *this;
}
Widget& Widget::operator=(const Widget& rhs){
Bitmap *pOrig = p; //记住原先的p
p = new Bitmap(*rhs.p);
delete pOrig;
return *this;
}