条款2:尽量以const,enum,inline替换#define
1.#define不被视为语言的一部分,并且使用常量会比#define导致较小的码
2.常量替换#define的两种情况
- 定义常量指针(当指针所指物为常量时,应该有两个const),const char* const A = “zhou”;
- class中的常量:将常量的作用域限制在类中,因此必须为类中的一个成员,但是常量只能有一份实体,因此需要将它成为一个实体,不能用#define创建一个class专属常量,因为没有封装性
class GamePlayer{
private:
static const int Num = 5; //常量声明
int scores[Num]; //使用该常量
};
const int GamePlayer::Num;
注意1:Num是声明而不是定义,类中的常量定义需要在类外进行:const int GamePlayer::Num(如果类中声明式已经有初值,则定义时不能再有初值,否则则需要初值)
注意2:当旧编译器不适用上述声明时就赋予初值再定义,当class编译期间需要这个常量值,如下:
class GamePlayer{
private:
static const int Num; //常量声明
int scores[Num]; //使用该常量
};
const int GamePlayer::Num = 5;
但是数组需要Num值,可以改变为如下:
class GamePlayer{
private:
enum { Num = 5 }; //常量声明
int scores[Num]; //使用该常量
};
3.对于形似函数的宏,用inline函数替换,函数宏会造成奇怪的错误
尤其是对表达式来说,由于宏是在预处理阶段直接替换掉相关代码,所以会有很多奇怪的问题