当咱们以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]; };