class Bitmap{...};
class Widget{
...
private:
Bitmap*pb;//指向堆
};
Widget& Widget::operator=(const Widget&rhs){//不安全版本
delete pb;//*this 和rhs 有可能是同一对象
pb = new Bitmap(*rhs.pb);
return *this;
}
Widget& Widget::operator=(const Widget&rhs){//改进版本1
if(this==&rhs) return *this;
delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
}
Widget& Widget::operator=(const Widget&rhs){//改进版本2
Bitmap*pOrig = pb; //精心周到的语句顺序
pb = new Bitmap(*rhs.pb);
delete pOrig;
return *this;
}
//--------------------
class Widget{
swap(Widget&rhs);//交换*this 和 rhs的数据
...
private:
Bitmap*pb;//指向堆
};
Widget& Widget::operator=(Widget&rhs){//改进版本3
Widget temp(rhs);
swap(temp);
return *this;
}
确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,行为仍正确