用#define定義的常量如:#define RAT 0.35 當運作此常量但獲得一個編譯錯誤資訊時,這個錯誤資訊也許會提到
0.35而不是RAT。如果RAT被定義到一個不熟悉的頭檔案裡,将會浪費時間而去追蹤它。是以這裡不建議使用#define
解決的方法就是用一個const 定義的常量替換這個宏:const double Rat = 0.35;
兩種特殊的情況:
第一是定義常量指針,如 const char* const Name = "Scott Meyers";,而利用string則可以這樣定義:const std::string Name("Scott Meyers");
第二是class專屬常量。為了将常量的作用域限制在class内,必須讓它成為class的一個成員,而為了確定此常量至多隻有一份實體,必須讓它成為一個static 成員:
class GamePlayer
{
private:
static const int NumTurns = 5; //常量聲明式
int scores[NumTurns];
};
const int GamePlayer::NumTurns; //常量定義式,因為在聲明時已經獲得初值,是以定義時不能再設初值
利用enum可以獲得同樣的效果:
class GamePlayer
{
private:
enum{NumTurns = 5};
int scores[NumTurns];
};
有的舊編譯器不支援const在聲明時設定初值,是以使用enum可以避免這個問題。enum 的行為某方面比較像#define而不像const,例如取一個const的位址是合法的,但取一個enum的位址就是不合法的,和#define相似。
利用inline可以替換類似函數的宏。如 #define CALL_MAX(a,b) f((a) > (b) ? (a) : (b))
template<typename T>
inline void callMax(const T& a, const T& b)
{
f(a > b ? a : b);
}