条款2:尽量以const,enum,inline替换#

例如:#define asp 1.635
这个只会在预编译的时候被处理,而不会在编译的时候被看到,所以当出现错误时系统会提示1.635的信息,而不会提示asp的信息,而当这个定义放在我们看不到的地方,我们将会奇怪我们怎么会出现1.635这个数字。

所以我们建议使用:const double asp=1.635代替上述的写法。

特许情况:1.声明指针常量的时候我们要将指针指向的数据和指针本身都声明为常量。
const char * const anthorName=“Scott Meyers”

2.为了将常量的作用于限制在类里面,我们必须让常量成为class的一个成员,而为确保此常量至多只有一份实体,我们必须让他成为一个static成员:

class K{
private:
static const int NumTurns =5;//声明该常量
int scores[NumTurns];//使用该常量
}

当我们要获取某个class专属常量地址的时候,有些傻逼的编译器非要看到NumTurns的定义式,所以我们必须得另外添加其定义式(不取地址,不用额外提供定义式)。

const int K::NumTurns;

由于声明时已经定义了初值,所以定义式不能在赋初值。
我们不能在类里面使用#define,因为#define没有作用于的概念。

由于就编译器不需static 成员在其声明上获取初值,所以我们得调整上述语法:

class K{
private:
static const int NumTurns =5;//声明该常量

}
const int K::NumTurns=1.35;

但是这样一来我们就不能在类里面使用1.35这个数字了,因为它的赋值在类实现文件里面。
这时我们使用enum来实现

class K{
private:
enum {NumTurns=5};
int scores[NumTurns];

}

enum有一个和#define相似的特点,那就是它也不能取地址。

2.用define定义宏也是不好的,比如:

#define K(a,b) f((a)>(b)?(a):(b))
这时
K(++a,b);//a被累加一次
K(++a,b+10);//a被累加两次

这时我们使用inline来代替:

template<typename T>
inline void K(const T& a,const T& b)
{
f(a>b?a:b);
}

但是也不是完全不适用#define,#include和#ifdef/#ifndef仍然是必须品。

猜你喜欢

转载自blog.csdn.net/Du_Shuang/article/details/82989513