effective C++ 2 prefer consts, enums and inlines to #defines
如果有#define A 1.23
这个记号A可能没进入记号表,那么如果在运用这个常量时发生了编译错误,错误信息提到了1.23而不是A,那么追踪这个错误就很费时,因为不知道这个1是哪里来的.
而如果用const double A = 1.23,那么A肯定会进入记号表,也就避免了上面的情况。并且对于浮点常量,常量可能比使用#define导致较小的码(因为如果是宏名称,会无条件把所有的A替换成1.23的)。
用常量替换#define时需要注意两种情况:
1.为了方便被多个文件引入,常量定义一般放在头文件里。对于常量指针,要把指针声明为const。
2.class专属常量。这也是优于#define的一个地方,因为#define不存在作用域一说。如果需要将常量的作用域限于class,那么需要让它成为class的一个成员,并且只有一个实体,所以它要是一个static成员。
而在class内部的只能算是声明式,所以还需要在一个实现文件里加入定义式,比如:
class A { private: static const int Num;//static class 常量声明 int array[Num]; };
const int A::Num;//static class常量定义,在实现文件里
假如编译器不支持static整数型class常量完成in class初值设定,那么可以采用enum hack,就是一个属于枚举类型的数值可以被当作int使用:
可以把上面的A改成这样:
class A { private: enum {Num =5} int array[Num]; };
最后提到了用inline函数替代像函数一样的宏,后面似乎会更详细的说明,所以先放一下。