您的位置:首页 > 编程语言 > C语言/C++

Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define

2014-10-30 22:50 375 查看
尽量使用const替换 #define定义常量的原因:

#define 不被视为语言的一部分

宏定义的常量,预处理器只是盲目的将宏名称替换为其的常量值,导致目标码中出现多分对应的常量,而const定义的常量,会进入记号表,使用到该常量的地方使用的同一份,使目标码的量更小点;

const可以在类中定义一个class专属常量,其作用域限制于class内。(注:如果一个class专属常量又是static又是整数类型,需要特殊处理。主要不取其地址,则,可以声明并使用但是无须提供定义式。如果,需要取地址,则一定要提供定义式)。优秀的编译器不会为整数型const对象设定另外的存储空间。

class GamePlayer
{
private:
static const int NumTurns = 5; //常量声明式 ,没有取其地址,所以定义式可以省略
int scores[NumTurns];
};


如果要取 NumTurns地址,则一定要提供定义式

const int GamePlayer:: NumTurns; // NumTurns定义式


上面的定义式,应该放在实现文件中,而非头文件。由于class常量已在声明时获得初值,因此定义时不可以再设初值。

无法使用#define创建class的专属常量,因为#define并不重视作用域。

对于类似函数的宏,最好使用inline函数替换 #define:

宏只是原班不动的替换,所以有时候会出现问题。比如:

#define CALL_WITH_MAX(a, b) f( (a) > (b) ? (a) : (b) )
int a = 5, b = 0;
CALL_WITH_MAX(++a, b); //a被累加二次
CALL_WITH_MAX(++a, b +10); //a被累加一次


执行的结果和预想的可能不一致。使用template inline函数就可以提供宏一样的效率,以及一般函数的可预料的行为和类型安全。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐