對於內置類型pass-by-value 比pass-by-reference高效,用戶自定義類型pass-by-reference-to-const更好函數
STL中迭代器和函數對象都是在C指針的基礎上塑造出來的,因此舊式的C pass-by-value再次試用this
一、對於單純的常量,最好以const對象或enums替代#define設計
二、對於形似函數的宏,最好用inline函數替代#define指針
由於使用的#define 的變量未進入編譯器的記號表(symbol table)code
#define ASPECT_RATIO 1.63 ==>const double AspectRatio = 1.63對象
void f1(const Widget* pw) <=> void f2(Widget const *pw) //等價,f1/f2得到一個指針,指向一個常量的(不變的)Widget對象資源
對內置類的對象進行手工初始化,由於C++不保證初始化它們。get
構造函數最好使用成員初值列,而不要在構造函數內使用賦值操做。前者效率更高,後者要先調用 default構造再賦值編譯器
爲免除「跨編譯單元之初始化次序」問題,請以local static對象替換non-local static對象。????io
九、編譯器能夠暗自爲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){} //拷貝複製函數 }
十二、爲駁回編譯器自動提供的技能,可將相應的成員函數聲明爲private而且不予實現。
1三、polymorphic帶有多態性質的base classes 應該聲明一個virtual析構函數。若是class帶有任何virtual函數,它就應該擁有一個virtual析構函數。當子類以父類指針的形式被析構時,子類對象的成分沒有被銷燬,故須要將父類的析構函數須要爲virtual
1四、Classes的設計目的若是不是做爲base classes使用,或不是爲了具有多態性,就不該該聲明virtual析構函數。
1五、若父類帶有pure virtual(純虛函數)時,子類的析構函數中會有對父類析構函數的調用,所以必須爲父類的純虛函數提供一份定義。
1六、析構函數絕對不要吐出異常,若是一個被析構函數調用的函數可能拋出異常,析構函數應該捕捉任何異常,而後吞下它們(再也不傳播)或結束程序。
1七、若是客戶須要對某些操做函數運行期間拋出的異常作出反應,那麼class應該提供一個普通函數(而非析構函數)執行該操做。
1八、子類構造時,先調用base class,此時子類被認爲是一個base class。析構時先調用自身的析構函數,再調用base class的析構函數。
Widget& operator=( constWidget& rhs){... return* this;}
20、確保當對象自我賦值時operator=有良好的行爲。其中技術包括比較「來源對象」和「目標對象」的地址、精心周到的語句順序、以及copy-and-swap。
2一、肯定任何函數若是操做一個以上的對象,而其中多個對象是同一個對象時,其行爲仍然正確。
條款12:複製對象時勿忘其每一成分。
資源管理:
2五、以對象管理資源的兩個關鍵想法:
(1)、得到資源後馬上放進管理對象。資源獲取時機即是初始化時機。
(2)、管理對象運用析構函數確保資源被釋放。
2六、使用shared_ptr智能指針。
條款14:在資源管理類中當心copying行爲。