尽量以const,enum,inline替换#define
1、无参宏定义的缺点
① 可能会导致编译错误
记号名称也许从未被编译器看见
也许编译器在开始处理源码之前,记号名称被预处理各移走,于是记号名称未进入记号表。
② #define 可能会比使用 const 导致更多的码。
③ #define 无法创建一个class专属常量,因为#define 并不重视作用域 cope,
#define 无法定义有封装性的变量,而const可以。
2. const 定义 class 专属常量
① 为了将常量的作用域限制于 class 内,必须让它成为 class 的一个成员(member)
为了保证常量只有一份实体,必须让它成为 static成员,
② 有一种情况无须为 class静态成员常量提供定义式,
该常量为整数类型,且不取其地址。
为了使用一般编译器,强烈建设提供定义式!
1 class GamePlayer { 2 private: 3 static const int NumTurns = 5; //静态成员常量的声明式 4 ... 5 }; 6 7 const int NumTurns; //静态成员常量的定义式
③ 若编译器不让 static 成员在其声明式上获初值,(in-class初值设定)
你可以将初值放在定义式.
④ 若编译器不让 static 成员在其声明式上获初值,而你想在
class编译期间需要一个 class 的常量值,
可使用 "The enum hack",其理论基础为:一个属于枚举
类型约数值可权充 ints 使用,
1 class GamePlayer { 2 private: 3 enum {NumTurns = 5}; 4 int scores[NumTurns]; 5 ... 6 };
⑤ 用 enum hack 俩个好处,
enum hack可以阻止用户获得常量的 pointer 或 reference.
enum和#define 一样绝不会导致非必要的内存分配,
3、有参宏定义
有参宏定义可以用template inline代替