當咱們以const常量替換#define,有兩種特殊狀況值得說說。函數
第一種是定義class外部的常量指針,這種常量定義式一般放在頭文件內以便被不一樣的源文件使用,所以有必要將指針自己聲明爲const。
例如要在頭文件內定義一個常量char *-based字符串,必須寫兩次const(左數右指),以下所示。指針
const char *const authorName = "Scott Meyers"; //必須寫兩次const,左數右指 const std::string authorName("Scott Meyers"); //更好的作法是採用string類型
第二個值得注意的是class專屬常量,爲了確保該常量最多隻有一份實體,必須讓它成爲static成員變量。code
class GamePlayer { private: static const int NumTurns = 5; //常量聲明式,而非定義式 int scores[NumTurns]; //使用該常量 };
注意,該示例中展現的是NumTurns的聲明式而非定義式,定義式應按照類的static成員變量的語法要求在.cpp文件中進行。
但若是一個常量既是class專屬常量又是static且爲整數類型(int、char、bool等),則需特殊處理,只要不取它們的地址,你能夠聲明並使用它們而無需提供定義式。
注意,in-class初值設定只適用於static整數常量,並且即便是static整數常量,有些編譯器也可能不支持這種操做,遇到這種狀況,能夠將初值放在定義式中。字符串
class GamePlayer { private: static const double FudgeFactor; //非整數常量,沒法進行-in-class初值設定 static const int NumTurns; //即便是整數常量,編譯器也可能不支持in-class初值設定 }; //static常量定義,位於.cpp文件 const double GamePlayer::FudgeFactor = 1.35; const int GamePlayer::NumTurns = 5;
若是編譯器不支持static整數常量的in-class初值設定,但該常量又必須在class編譯期間使用,如GamePlayer::scores數組大小,可改用enum代替const。編譯器
class GamePlayer { private: enum { NumTurns = 5 }; int scores[NumTurns]; };