结论1:确保当对象自我赋值时operator=有良好行为,其中技术包括比较“来源对象”和“目标对象"的地址(证同测试)、精心周到的语句顺序、以及copy-and-swap。
例如:
class Bitmap { ... };
class Widget {
...
private:
Bitmap* pb;
};
证同测试:
Widget& Widget::operator= (const Widget& rhs) {
if (this == &rhs) return *this;
delete pb;
pb = new Bitmap(*rhs.pb);//具备了”自我赋值安全性“,但不具备”异常安全性“,如果”new Bitmap“导致异常,Widget最终会持有一个指针指向一块被删除的Bitmap。
return *this;
}
精心周到的语句顺序:
Widget& Widget::operator= (const Widget& rhs) {
Bitmap* pOrig = pb;//对原bitmap做了一份复件,不但确保了”异常安全“而且确保了”自我赋值安全”
pb = new Bitmap(*rhs.pb);
delete pOrig;
return *this;
}
copy-and-swap技术:
class Widget {
...
void swap(Widget & rhs);
...
};
Widget& Widget::operator= (const Widget& rhs) {
Widget temp(rhs);
swap(temp);
return *this;
}
考虑到函数以by value方式传递参数时会造成一份副本,可以采用如下方法:
Widget& Widget::operator=(Widget rhs){
swap(rhs);
return *this;
}
结论2:确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。