effective c++ (四)

來源:互聯網
上載者:User

標籤:分配   繼承   ring   sse   str   協議   體系   認同   函數   

條款10:令operator=返回一個reference to *this

為了實現“連鎖賦值”,賦值操作符必須返回一個reference指向操作符的左側實參,這是你為classes實現賦值操作符時應該遵循的協議。

class Widget{public:      ...      Widget& operator+=(const Widget& rhs)   //同樣適用於-=, *=      {              ...              return *this;      }      Widget& operator=(const Widget& rhs)   //同樣適用於-=, *=      {              ...              return *this;      }      Widget& operator=(int rhs)   //此函數也是和,即使此一操作符參數類型不符合協定      {              ...              return *this;      }};

注意,這隻是一個協議,並無強制性。如不遵循它,代碼一樣可以通過編譯。然而這份協議被所有內建類型和標準程式庫提供的類型工作遵守(string vector  complex tr1::shared_ptr)

請記住:

  • 令賦值操作符(assignment)操作符返回一個reference to *this

 

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

1、一般而言,如果某段代碼操作pointers或references而它們被用來“指向多個相同類型”,就需要考慮這些對象是否為同一個。實際上,兩個對象只要來自同一個繼承體系,甚至不需要聲明為相同類型就可能造成“別名”(應為base class的指標或引用可以指向一個derived)。如:

a[i] = a[j] //若i與j具有相同的值,這便是自我賦值;

*px = *py//如果px與py恰巧指向同一個對象,則時自我賦值

void doSomething(const Base& rb, Derived* pd);//若rb與rp可能指向同一個對象

 2、如果遵循條款13和14的忠告,你會運用對象來管理資源,而且你可以確定所謂“資源管理對象”在copy發生時有正確的舉措。在這種情況下你的賦值操作符或許是“自我賦值安全的”(self-assignment-safe),不需要額外操心

3、如下代碼,在自我賦值時會會拋出異常

class Bitmap { ... };class Widget {      ...private:   Bitmap* pb;  };Widget& Widget::Operator=(const Widget& rhs){    delete pb;    pb = new Bitmap(*rhs.pb);   return *this;       }

這裡若是自我複製問題是,operator=函數內的*this和rhs有可能是同一對象;若是如此delete就不只是銷毀當前對象的bitmap,也銷毀了rhs的bitmap

Widget& Widget::operator=(const Widget& rhs){     if(this == &rhs) return *this;     delete pb;     pb = new Bitmap(*rhs.pb);     return *this; }

如此在賦值前進行一個“認同測試(identify test)”達到自我賦值的檢驗目的

但是此段代碼不具備“異常安全性”,在new Bitmap導致異常(不論是因為分配時記憶體不足或因為Bitmap的copy建構函式拋出異常),Widget最終會持有一個指標指向一塊被刪除的Bitmap。

 

effective c++ (四)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.