C++程式設計規範 1-3章
第1章 命名原則
1.型別名:每個英文單詞的第一個字母大寫,其他小寫,最後以_T結尾。
class PageCode_T
{
//...
};
原因:
- 防止與變數名衝突
- 使得型別名更加清晰
- 區分名字中各單詞也可以用下劃線
- 縮寫字當作普通字處理
- 因為namespace是表示一個邏輯組,與class和enum的某些用法類似,所以採用同樣的命名原則
1.2 關於變數和函式名:首字母小寫,其後每個單詞的第一個字母大寫。
int lengthAndWidth(void) const;
1.3 全大寫的函式名(建議):呼叫普通函式的函式
- 閱讀簡潔
- 跟原函式只有大小寫的區別
- 效率高,可用inline方式實現這類函式
1.4關於巨集,常量和模板名:全部大寫,如有多個單詞,用下劃線分隔。
#define PI 3.1415926
enum{BLUE,RED,WHITE};
template<class TYPE>
class List_T
{
//...
};
1.5關於指標識別符號名:建議以p開頭或以Ptr結尾
char *pName;
1.6關於變數名字首:
i_ 類內資料成員 instance scope
c_ 類內靜態資料成員 class scope
g_ 全域性變數 global scope
f_ 檔案作用域變數 file scope
1.7減少匿名名稱空間級識別符號:可以歸類放在某個名稱空間、類或函式中
原因:
- 明顯減少命名衝突
- 歸類後使用更清晰
- 縮短生命週期
1.8名字要本著清楚、簡單的原則:幫助對程式碼的理解
int returnStatus;
int alarmNumber;
1.9關於函式的左值和右值引數名:用lhs做左值引數的名字,用rhs做右值引數的名字
int operator=(String const &lhs,String const &rhs);
第2章 型別的使用
1.避免隱式宣告型別
main(); //int main(void) void foo(const aValue); //void foo(const int aValue);
2.慎用無符號型別:不同的C++標準中有符號和無符號的轉換規則不同
3.少用浮點數除非必須
- 浮點數不精確
- 浮點數的異常處理複雜
- 運算速度慢
4.用typedef簡化程式中的複雜語法
5.少用union
6.慎用位操作
- 效率低下
- 可能帶來相容性問題
7.用enum取代常量
- 易於維護
- 比#define或 int const更安全
- 在類中使用更方便
- 減少匿名名稱空間級變數、常量、巨集及函式
8.使用內建bool型別:只有true和false
9.儘量用引用取代指標
- 被引用的物件永遠不可能是空
- 引用某一個物件後不會再去引用其他物件
- 某些operator函式的返回值
- 函式的引數傳遞
第3章 函式
1.函式原型宣告放在一個頭檔案中
2.函式無引數一定要用void標註
3.對於內建型別引數應傳值
4.對於非內建型別引數應傳遞引用或指標
- 不用拷貝
- 不用構造和析構
- 有利於非內建型別的擴充
- 有利於函式支援派生類
5.何時用指標傳遞引數:取捨的關鍵是:NULL是否是一個合法的取值
- 函式內部將自己的引數以指標形式傳給其他的函式
- 若引數是被new出來的,且將要在函式內被釋放
6.避免使用引數不確定的函式:可以使用過載和鏈式函式
7.若不得不使用引數不確定的函式,用<stdarg.h>提供的方法
va_list
va_start
va_end
8.避免函式的引數過多
9.儘量保持函式只有一個出口
10.(非void)任何情況都要有返回值
11.返回指標型別的函式應該用NULL表示失敗
12.禁止成員函式返回成員(可讀寫)的引用或指標
13.重複使用的code用function代替
14.虛友元函式:把友元函式定義成虛擬函式,子類繼承該友元介面而無需重複宣告友元