Effective C++学习笔记——构造/析构/拷贝运算
生活随笔
收集整理的這篇文章主要介紹了
Effective C++学习笔记——构造/析构/拷贝运算
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
條款9:決不再構造和析構過程中調用virtual函數,包括通過函數間接調用virtual函數。 應用:想在一個繼承體系中,一個derived class被創建時,某個調用(例如生成相應的日志log)會有相對應的實現。 原因: base class的構造函數會先被調用,而在base class 構造期間virtual函數絕不會下降到dedrived class階層。事實上,C++的其它部分(dynamic_cast & typeid),在此期間也是一樣的把對象視為base class。 解決辦法:籍由”令derived class 將必要的構造信息向上(通過函數參數)傳遞至base class的構造函數“。可以在dedrived class中定義一個private static函數來得到該構造信息, 定義為static是為了避免使用尚未初始化好的dedrived class 成員。 條款10、11: 令assignment操作符返回一個reference to *this。同時注意在operator=中處理”自我復制“! 說明:operator=要考慮”自我復制安全性“和”異常安全性“。涉及的技術包括:比較”來源對象“和”目標對象“的地址、精心周到的語句順序、以及copy-and-swap技術。 1: class A 2: { 3: ... 4: private: 5: int *p; 6: } 7: //1 各種不安全 8: A& A::operator=(const A& rhs) 9: { 10: delete p; 11: p = new A(*rhs.p); 12: return *this; 13: } 14: 15: //2 語句順序的改變,帶來“自我復制安全”(雖然也許不夠高效)與“異常安全”。 16: A& A::operator=(const A& rhs) 17: { 18: pOrig = p; 19: p = new A(*rhs.p); 20: delete pOrig; 21: return *this; 22: } 23: 24: //3 copy-and-swap技術 25: void A::swap(A& rhs) 26: { 27: ...//交換*this與rhs 28: } 29: A& A::operator=(const A& rhs) 30: { 31: A temp(rhs); 32: swap(rhs); 33: return *this; 34: } 35: 36: //4 巧妙伶俐的利用值傳遞在制造臨時副本,即使有可能更為高效(在“函數參數構造”)卻犧牲了清晰性。 37: A& A::operator=(const A rhs) 38: { 39: swap(rhs); 40: return *this; 41: } 條款12:復制對象時勿忘其每一個成分 備注:不要嘗試以某個copying函數來實現另一個copying函數(copy構造函數,operator=函數)。
轉載于:https://www.cnblogs.com/oldpeanut/p/3349792.html
總結
以上是生活随笔為你收集整理的Effective C++学习笔记——构造/析构/拷贝运算的全部內容,希望文章能夠幫你解決所遇到的問題。