Effective C++ 读书笔记之Part2.Constructors, Destructors, and Assignment Operators
生活随笔
收集整理的這篇文章主要介紹了
Effective C++ 读书笔记之Part2.Constructors, Destructors, and Assignment Operators
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
5.Know what functions C++ silently writes and calls.
總結:編譯器可以暗自為class創建default構造函數、copy構造函數、copy assginment操作符,以及析構函數。這些函數都是public的,并且是inline的。
6.Explicitly disallow the use of compiler-generated functions you to not want.
總結:為駁回編譯器自動(暗自)提供的機能,可將相應的成員函數聲明為private并且不予實現。使用像Uncopyable這樣的base class也是一種做法。
該條目主要是通過將copy 和copy assignment兩個函數,聲明為private并且不實現函數,這樣編譯器就不會默認產生這兩個函數,并且也避免了對這兩個函數的直接調用。
7.Declare destructors virtual in polymorphic base classes.
總結:
第一,polymorphic(帶多態性質的)base classes 應該聲明一個virtual析構函數。如果class帶有任何virtual函數,它就應該擁有一個virtual析構函數。
第二,classes的涉及目的如果不是要作為base classes使用,或者不是為了具備多態性(polymorphically),就不該聲明virtual析構函數。
8.Prevent exception from leaving destructors.
總結:
第一,析構函數絕對不要吐出異常。如果一個被析構函數調用的函數可能拋出異常,析構函數應該捕捉任何異常,然后吞下他們(不傳播)或結束程序。
第二,如果客戶需要對某個操作函數運行期間拋出的一場作出反應,那么class應該提供一個普通函數(而非在析構函數中)執行該操作。
9.Never call virtual functions during construction or destruction.
總結:
在構造和析構期間不要調用virtual函數,因為這類調用從不下降致drived class(比起當前執行構造函數和析構函數那層)。
如果實在是想調用,則可以使用drived classes將必要的構造信息向上傳遞至base class構造函數。但是這時候調用的函數應改為非virtual函數。
10.Have assignment operators return a reference to *this.
總結:
令賦值(assignment)操作符返回一個reference to *this.
11. Handle assignment to self in operator=.
總結:
第一,確保當前對象自我賦值時operator=有良好行為。其中技術包括比較“來源對象”和“目標對象”的地址、精心周到的語句順序、以及copy-and-swap。
第二,確定任何函數如果操作一個以上的對象,而其中多個對象是同一個對象時,其行為仍然正確。
12. Copy all parts of an object.
如果自己寫copy函數,其中有部分成員未被copy,編譯器不會提醒。即使是在最高的警告級別中。
總結:
第一,copying 函數應該確保復制“對象內的所有成員變量”及“所有base class成分”。
第二,不要嘗試以某個copying函數實現另一個copying函數。應該將共同機能放進第三個函數中,并由兩個copying函數共同調用。
感想:這部分內容主要是關于構造函數和析構函數的。因為編譯器會默認給class生成構造函數、析構函數、copy和copy assignment函數。所以這就引出了一系列的問題,如果避免別人調用系統生成的這些函數而犯錯,如何自己構造這些函數,構造這些函數的時候需要注意哪些問題。這些內容就構成了本部分的全部內容,提到的這些點確實是平時很容易犯錯的點,學習了之后,很有利于提高代碼的質量。
總結:編譯器可以暗自為class創建default構造函數、copy構造函數、copy assginment操作符,以及析構函數。這些函數都是public的,并且是inline的。
6.Explicitly disallow the use of compiler-generated functions you to not want.
總結:為駁回編譯器自動(暗自)提供的機能,可將相應的成員函數聲明為private并且不予實現。使用像Uncopyable這樣的base class也是一種做法。
該條目主要是通過將copy 和copy assignment兩個函數,聲明為private并且不實現函數,這樣編譯器就不會默認產生這兩個函數,并且也避免了對這兩個函數的直接調用。
7.Declare destructors virtual in polymorphic base classes.
總結:
第一,polymorphic(帶多態性質的)base classes 應該聲明一個virtual析構函數。如果class帶有任何virtual函數,它就應該擁有一個virtual析構函數。
第二,classes的涉及目的如果不是要作為base classes使用,或者不是為了具備多態性(polymorphically),就不該聲明virtual析構函數。
8.Prevent exception from leaving destructors.
總結:
第一,析構函數絕對不要吐出異常。如果一個被析構函數調用的函數可能拋出異常,析構函數應該捕捉任何異常,然后吞下他們(不傳播)或結束程序。
第二,如果客戶需要對某個操作函數運行期間拋出的一場作出反應,那么class應該提供一個普通函數(而非在析構函數中)執行該操作。
9.Never call virtual functions during construction or destruction.
總結:
在構造和析構期間不要調用virtual函數,因為這類調用從不下降致drived class(比起當前執行構造函數和析構函數那層)。
如果實在是想調用,則可以使用drived classes將必要的構造信息向上傳遞至base class構造函數。但是這時候調用的函數應改為非virtual函數。
10.Have assignment operators return a reference to *this.
總結:
令賦值(assignment)操作符返回一個reference to *this.
11. Handle assignment to self in operator=.
總結:
第一,確保當前對象自我賦值時operator=有良好行為。其中技術包括比較“來源對象”和“目標對象”的地址、精心周到的語句順序、以及copy-and-swap。
第二,確定任何函數如果操作一個以上的對象,而其中多個對象是同一個對象時,其行為仍然正確。
12. Copy all parts of an object.
如果自己寫copy函數,其中有部分成員未被copy,編譯器不會提醒。即使是在最高的警告級別中。
總結:
第一,copying 函數應該確保復制“對象內的所有成員變量”及“所有base class成分”。
第二,不要嘗試以某個copying函數實現另一個copying函數。應該將共同機能放進第三個函數中,并由兩個copying函數共同調用。
感想:這部分內容主要是關于構造函數和析構函數的。因為編譯器會默認給class生成構造函數、析構函數、copy和copy assignment函數。所以這就引出了一系列的問題,如果避免別人調用系統生成的這些函數而犯錯,如何自己構造這些函數,構造這些函數的時候需要注意哪些問題。這些內容就構成了本部分的全部內容,提到的這些點確實是平時很容易犯錯的點,學習了之后,很有利于提高代碼的質量。
轉載于:https://www.cnblogs.com/ainima/archive/2013/05/13/6331976.html
總結
以上是生活随笔為你收集整理的Effective C++ 读书笔记之Part2.Constructors, Destructors, and Assignment Operators的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php使用strstr函数 ,判断字符串
- 下一篇: [转]给UIImage添加圆角(圆角矩形