effective c++

  • 條款1:視C++爲一個語言聯邦:C、Object-Oriented C++、Template C++、STL

對於內置類型pass-by-value 比pass-by-reference高效,用戶自定義類型pass-by-reference-to-const更好函數

STL中迭代器和函數對象都是在C指針的基礎上塑造出來的,因此舊式的C pass-by-value再次試用this

  • 條款2:儘可能以const,enum,inline替換#define

一、對於單純的常量,最好以const對象或enums替代#define設計

二、對於形似函數的宏,最好用inline函數替代#define指針

由於使用的#define 的變量未進入編譯器的記號表(symbol table)code

#define ASPECT_RATIO 1.63 ==>const double AspectRatio = 1.63對象

  • 條款3:儘量使用const

void f1(const  Widget* pw)  <=> void f2(Widget const *pw)     //等價,f1/f2得到一個指針,指向一個常量的(不變的)Widget對象資源

  • 條款4:肯定對象使用前已被初始化。

對內置類的對象進行手工初始化,由於C++不保證初始化它們。get

構造函數最好使用成員初值列,而不要在構造函數內使用賦值操做。前者效率更高,後者要先調用 default構造再賦值編譯器

爲免除「跨編譯單元之初始化次序」問題,請以local static對象替換non-local static對象。????io

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

九、編譯器能夠暗自爲class建立default構造函數、copy構造函數、copy assignment操做符,以及析構函數。是 public且 inline 的

十、當手工建立一個構造函數後,編譯不會再建立default構造函數。

十一、內含引用或const成員,編譯器不會建立copy assignment操做符。

class Empty{}
==》
class Empty{
    public:
       Empty(){}    
       Empty(const Empty& rhs){}
       ~Empty(){}    
       Empty& operator=(const Empty& rhs){} //拷貝複製函數
}
  • 條款6:若不想使用編譯器自動生成的函數,應該明確拒絕。

十二、爲駁回編譯器自動提供的技能,可將相應的成員函數聲明爲private而且不予實現。

  • 條款7:爲多態基類聲明virtual析構函數。

1三、polymorphic帶有多態性質的base classes 應該聲明一個virtual析構函數。若是class帶有任何virtual函數,它就應該擁有一個virtual析構函數。當子類以父類指針的形式被析構時,子類對象的成分沒有被銷燬,故須要將父類的析構函數須要爲virtual

1四、Classes的設計目的若是不是做爲base classes使用,或不是爲了具有多態性,就不該該聲明virtual析構函數。

1五、若父類帶有pure virtual(純虛函數)時,子類的析構函數中會有對父類析構函數的調用,所以必須爲父類的純虛函數提供一份定義。

  • 條款8:別讓異常逃離析構函數。

1六、析構函數絕對不要吐出異常,若是一個被析構函數調用的函數可能拋出異常,析構函數應該捕捉任何異常,而後吞下它們(再也不傳播)或結束程序。

1七、若是客戶須要對某些操做函數運行期間拋出的異常作出反應,那麼class應該提供一個普通函數(而非析構函數)執行該操做。

  • 條款9:毫不在構造和析構過程當中調用virtual函數。

1八、子類構造時,先調用base class,此時子類被認爲是一個base class。析構時先調用自身的析構函數,再調用base class的析構函數。

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

Widget& operator=( constWidget& rhs){... return* this;}

  • 條款11:在operator=中處理「自我賦值」

20、確保當對象自我賦值時operator=有良好的行爲。其中技術包括比較「來源對象」和「目標對象」的地址、精心周到的語句順序、以及copy-and-swap。

2一、肯定任何函數若是操做一個以上的對象,而其中多個對象是同一個對象時,其行爲仍然正確。

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

資源管理:

  • 條款13:以對象管理資源。

2五、以對象管理資源的兩個關鍵想法:

(1)、得到資源後馬上放進管理對象。資源獲取時機即是初始化時機。

(2)、管理對象運用析構函數確保資源被釋放。

2六、使用shared_ptr智能指針。

條款14:在資源管理類中當心copying行爲。

相關文章
相關標籤/搜索