众所周知,使用const来替换#define定义的常量是一个不错的选择,当我们以常量替换预处理时,有两点值得注意:
1.常量指针
在定义常量指针时,由于常量定义式通常置于头文件内,同时在多次调用时为了避免不必要的修改,因此有必要将指针声明为const,而非指针所指的对象。如果你需要将指向对象也声明为const,则需要两个const.举例而言:
1 const char* const authorname = “mie”;当然,这里使用string比使用char-based字符串更合适。
2.class的专属常量
在定义class的专属常量时,为了将变量的作用域仅仅局限在class内,我们将其作为class的一个成员。为了确保此常量至多只有一份实体,我们将其设为static。举例而言:
1 static const int sc = 5;
值得注意的是,此处只是sc的声明而非定义。通常意义下,c++需要你对你所使用的任何东西提供一个定义式。
*但如果它是一个class的static const member且为intergral type(int,char,bool),则需要特殊处理。
如果你无需获取地址,那你可以只声明不定义。但如果你需要使用地址或者你的编译器非要看到一个定义式,则应该另外提供定义式如下:
1 const int GamePlayer::NumTurns;
由于const class member在声明时获得了初值,因此在定义时不可再设初值。
如果class在编译期间需要一个class常量,比如说数组声明式。那么我们也没必要非要用#define。
我们可以使用enum hack来提供一个整形数据,因为一个枚举类型的数值总可以充当int被使用,例如:1
2enum {NumTurns = 5};
int scores[NumTurns];
这样写有两个好处:
- enum的行为比较像#define而不是const,比如你无法对它取址,也无法有一个pointer或者reference指向它。同时,避免使用了额外的内存空间以存储const int.
- 实用主义 很多代码使用了它
#define还有一个作用就是有人喜欢用它写宏。实际上这样根本不方便而且难于维护。我们有更好的替代方法:template inline函数
总结:
- 对于单纯常量,最好用const对象与enum替换#define
- 对于形似函数的宏,最好使用inline函数替代