Effective C++之2.構造析構賦值運算

條款05:瞭解C++默默編寫並調用哪些函數

編譯器可以暗自爲class創建default構造函數、copy構造函數、copy assignment操作符,以及析構函數。

條款06:如不想使用編譯器自動生成的函數,就應該明確拒絕

爲了駁回編譯器暗自提供的機能,可將相應的成員函數聲明爲private並且不予實現。使用像Uncopyable這樣的base class 也是一種做法。不過C++11開始,可以用delete實現。

class HomeForSale
{
public:
    ...
    HomeForSale(const HomeForSale&)=delete;
    HomeForSale& operator=(const HomeForSale&)=delete;
    ...
};

條款07:爲多態基類聲明virtual析構函數

這一點很重要。polymorphic base classes應該聲明一個virtual析構函數。如果class帶有任何virtual函數,它就應該擁有一個virtual析構函數。classes的設計目的如果不是作爲base classes使用,或不適爲了具備多態性,就不該聲明virtual析構函數。

條款08:別讓異常逃離析構函數

析構函數絕對不要吐出異常。如果一個被析構函數調用的函數可能拋出異常,析構函數穎捕捉任何異常,然後吐下它們(不傳播)或結束程序。如果客戶需要對某個操作函數運行期間拋出的異常做出反應,那麼class應該提供一個普通函數(而非在析構函數中)執行該操作。

條款09:絕不在構造和析構過程中調用virtual函數

在構造和析構期間不要調用virtual函數,因爲這類調用從不下降至derived class(比起當前執行構造函數和析構函數的那層)。

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

這只是個協議,並無強制性。如果不遵循它,代碼一樣可以通過編譯。然而這份協議被所有內置類型和標準程序庫的類型共同遵循。因此除非你有一個標新立異的理由,不然還是隨衆吧。

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

自我賦值發生在對象被賦值給自己時。這裏以精心周到的語句順序的技術爲例,其確保當對象自我賦值是operator=有良好行爲。

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

條款12:複製對象時勿忘其每一個成分

Copying函數應該確保複製“對象內的所有成員變量”及“所有base class 成分”。不要嘗試以某個copying函數實現另一個copying函數。應該將共同機能放進第三個函數中,並由兩個copying函數共同調用。

發佈了262 篇原創文章 · 獲贊 168 · 訪問量 54萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章