用#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);
}