1. 儘可能用const和inline,而不用#define,即儘可能用編譯器,而不用預處理器。
2. 儘可能用iostream,而不用stdio.h。
3. 儘可能用new和delete,而不用malloc和free,由於new和delete會執行構造函數和析構函數,而malloc和free不會。
4. 儘可能在函數中使用C++風格的註釋 // 函數頭用/* */
5. new和delete與malloc和free要成對出現。
6. 析構函數裏對指針成員delete,delete NULL指針並不影響什麼。
7. 預先準備好內在不夠的狀況,try{ new..} catch(bad_alloc baex) {}
8. 寫operator new和operator delete時要遵循常規。
9. 若是寫了operator new,就要寫operator delete。
10. 爲須要動態分配內存的類提供一個複製構造函數和賦值操做運算符。
11. 儘可能使用初始化,而不在構造函數裏賦值。CC::CC(int v_value) : value(v_value) {}
12. 初始化列表中成員的列出順序與成員的在類中的聲明順序相同。
13. 肯定基類有虛析構函數,不然釋放子類時只能執行基類的析構函數,而不會執行子類的虛構函數。
14. 讓operator= 返回*this的引用, (a = b) = c;只是爲了這個能正確執行,不過這但是一個很阿格里拉的編程風格。
15. 在operator= 中對全部數據成員賦值。
16. 在operator= 中檢查對本身賦值的狀況。如不處理這種狀況,在operator= 中先釋放指針對象數據,
而後再把目標的數據複製過來,由於是本身給本身複製,但數據已經釋放,因此發生錯誤。
17. 爭取使類的接口完整並最小。
18. 分清成員函數,非成員函數和友元函數。
19. 避免public接口出現數據成員。set, get.
20. 儘量使用const。
21. 儘可能傳引用,而不是傳值。const ClassName&。
22. 必須返回一個對象時,不要試圖返回一個引用。如函數中的臨時變量的引用。
23. 在函數重載和設定參數缺省值的函數之間慎重選擇。
24. 避免指針和數字類型重載:void func(int x)與void func(string* str)傳入0時:func(static_cast<string*>(null)。
25. 若是不想使用隱式生成的函數,就顯示的禁用它:private Array& operator=(const Array& ref);
26. 使用名字空間的好處:儘量的避免名字衝突引起的問題。假如一個程序中有幾百個名字衝突,名字空間能很好的解決這個問題。
27. 避免返回內部數據的句柄:指針。
28. 避免返回private和protected成員的非const引用和指針。
29. 千萬不要返回局部對象的引用,也不要返回函數內部定義的new初始化的指針,容易忘掉delete。
30. 儘量推遲變量的定義,這個在C中作不到,定義無用的變量必然伴隨無用的開銷。
31. 將文件間的編譯依賴性降至最低:分離的關鍵在於:對類的聲明的依賴與對類的定義的依賴:
儘可能讓頭文件不要依賴於另的文件。如使用ImageLoad.h中的Image類,在類的聲明中不要#include"ImageLoad.h",
而只是聲明類class Image; 在類的定義中才使用#include"ImageLoad.h"。
儘可能不要在頭文件中包含其餘的頭文件。
32. 使用函數體現「是一個」的含義,而不是「有一個」。
33. 明智的使用多繼承,這東西很差玩。
34. 編譯器能爲咱們自動生成的函數:
構造函數,析構函數,複製構造函數,賦值運算符重載,一對取地址運算符。
35. 寧肯編譯連接時出錯,也不肯運行時出錯。極少狀況下會使用C++拋出異常:內存耗盡:
C++中沒有上溢,下溢,除零檢查,數組越界檢查。
36. 重視編譯器警告。
37. 熟悉標準庫,在名字空間std中的。C++的僞標準庫,如iostream.h, limits.h。
38. 常變量,類成員,父類構造函數要放在初始化列表初始化。
39. 指針定義時初始化爲NULL。
40. 終極解決大法:良好的編譯習慣可很避免上面不少狀況的發生,若有一天C++的語法變得像Java同樣限制那麼多,
就不會出現這麼多問題,不過也正由於如此,纔出現了N多C++奇淫技巧,就如茴香豆的茴有四種寫法,
這裏可不止四種。