11.1.3 const 成員函式
任何**不修改資料成員**的函式都應宣告為 const 型別。撰寫 const 成員函式時若誤修改資料成員或呼叫非 const 成員函式,編譯器將報錯,無疑提升健壯性。
class Stack {
public:
void Push(int elem);
int Pop();
int GetCount() const; // 僅計數,邏輯上應為 const
private:
int m_num;
int m_data[100];
};
int Stack::GetCount() const {
++m_num; // 編譯錯誤:企圖修改資料成員
Pop(); // 編譯錯誤:企圖呼叫非 const 函式
return m_num;
}
const 關鍵字只能放在函式宣告尾部(因其他位置已被佔用)。
11.2 提升程式效率
- 時間效率:執行速度;空間效率:記憶體/外部儲存佔用。
- 全域效率:系統整體角度;局部效率:模組/函式角度。
效率優化六大鐵律
- 規則 11-2-1:不一味追求效率,在正確性、可靠性、健壯性、可讀性滿足前提下優化。
- 規則 11-2-2:以全域效率為主,局部效率為輔。
- 規則 11-2-3:先找出限制效率的瓶頸,勿在無關緊要處優化。
- 規則 11-2-4:先優化資料結構與演算法,再優化執行程式碼。
- 規則 11-2-5:時間/空間效率有時對立,分析何者重要,作適當折衷(如多花記憶體換效能)。
- 規則 11-2-6:不追求緊湊程式碼,緊湊碼不等於高效機器碼。
11.3 十四條實戰防錯建議
- 建議 11-3-1:當心視覺上難辨識的運算子寫錯(
== 誤寫 =,|| 少一竿等),編譯器不一定能自動偵測。
- 建議 11-3-2:變數(指標、陣列)建立後**及時初始化**,防未初始化變數當右值用。
- 建議 11-3-3:當心變數初值/預設值錯誤、精度不足。
- 建議 11-3-4:當心資料型別轉換錯誤。盡量用顯式轉換(讓人知發生何事),避免編譯器悄悄隱式轉換。
- 建議 11-3-5:當心變數上溢/下溢、陣列下標越界。
- 建議 11-3-6:當心忘寫錯誤處理、錯誤處理本身有誤。
- 建議 11-3-7:當心檔案 I/O 錯誤。
- 建議 11-3-8:避免撰寫高技巧性程式碼。
- 建議 11-3-9:別設計面面俱到、過度靈活的資料結構。
- 建議 11-3-10:原碼品質好則盡量復用;品質差則**重寫**,勿修補。
- 建議 11-3-11:盡量用標準庫函式,別「發明」已存在的輪子。
- 建議 11-3-12:盡量不用與特定硬體/軟體環境緊耦合的變數。
- 建議 11-3-13:編譯器警告等級設為**最嚴格**。
- 建議 11-3-14:可能的話,用 PC-Lint、LogiScope 等工具程式碼審查。
參考文獻
- [Cline] C++ FAQs
- [Eckel] Thinking in C++
- [Maguire] Writing Clean Code
- [Meyers] Effective C++
- [Murry] C++ Strategies and Tactics
- [Summit] C Programming FAQs