effective c++ 條款11:在operator=中處理“自我賦值”

來源:互聯網
上載者:User

標籤:出現   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=中處理“自我賦值”

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.