1. 程式人生 > >條款2:盡量以const,enum,inline替換#define

條款2:盡量以const,enum,inline替換#define

static 處理 沒有 作用域 def sco 編譯器 常量指針 聲明式

1.#define不被視為語言的一部分,並且使用常量會比#define導致較小的碼 2.常量替換#define的兩種情況
  • 定義常量指針(當指針所指物為常量時,應該有兩個const),const char* const A = “zhou”;
  • class中的常量:將常量的作用域限制在類中,因此必須為類中的一個成員,但是常量只能有一份實體,因此需要將它成為一個實體,不能用#define創建一個class專屬常量,因為沒有封裝性
class GamePlayer{ private: static const int Num = 5; //常量聲明 int scores[Num]; //使用該常量 }; const int GamePlayer::Num; 註意1:Num是聲明而不是定義,類中的常量定義需要在類外進行:const int GamePlayer::Num(如果類中聲明式已經有初值,則定義時不能再有初值,否則則需要初值) 註意2:當舊編譯器不適用上述聲明時就賦予初值再定義,當class編譯期間需要這個常量值,如下: class GamePlayer{ private: static const int Num; //常量聲明 int scores[Num]; //使用該常量 }; const int GamePlayer::Num = 5; 但是數組需要Num值,可以改變為如下: class GamePlayer{ private: enum { Num = 5 }; //常量聲明 int scores[Num]; //使用該常量 }; 3.對於形似函數的宏,用inline函數替換,函數宏會造成奇怪的錯誤   尤其是對表達式來說,由於宏是在預處理階段直接替換掉相關代碼,所以會有很多奇怪的問題

條款2:盡量以const,enum,inline替換#define