標籤:出現 code copy pre new some 方式 bit oid
注意:
確保當對象自我賦值時operator=有良好行為。
class Widget { ... };Widget w;...w = w; //賦值給自己a[i] = a[j]; //潛在的自我賦值*px = *py; //潛在的自我賦值class Base { ... };class Derived: public Base { ... };void doSomething(const Base& rb, Derived* pd); //rb和*pd有可能是同一對象
class Bitmap { ... };class Widget { ...private: Bitmap* pb;};Widget&Widget::operator=(const Widget& rhs) //不安全的operator=實現版本{ delete pb; pb = new Bitmap(*rhs.pb); return *this;}
如果是自我賦值,那rhs.pb就已經被delete pb了。
解決方案:比較是否同一個對象
Widget& Widget::operator=(const Widget& rhs){ if (this == &rhs) return *this; //identity test delete pb; pb = new Bitmap(*rhs.pb); return *this;}
上面的代碼還有個潛在問題,如果Bitmap出現異常了,但pb已經被delete了。
較好的一個方法:
Widget& Widget::operator=(const Widget& rhs){ Bitmap* pOrig = pb; 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;}
effective c++ 條款11:在operator=中處理“自我賦值”