(1)尽量以const、enum、inline替换#define

来源:互联网 发布:mac电脑忘记密码怎么办 编辑:程序博客网 时间:2024/05/24 06:38

 一、对于 #define AS 1.6,通常用 const double ASI=1.6;来替换更好

原因如下:
(1)ASI肯定可以写被编译器看到,当然就会进入记号表内;
(2)对浮点常量而言,使用常量可能比使用#define导致较小量的码;

当我们以常量替换#defines,有两种特殊情况必须要说明:
(1)定义常量指针,有必要将指针声明为 const。例如若要在头文件内定义一个常量 char*-based字符串,必须写两次 const:
const char*const authorName ="Tom Tomas";通常使用 string对象更好,因此可以改写为
const std::string authorName =("Tom Tomas");

(2)第二个值得注意的是class常量。为了将常量的作用域限制于class内,你必须让它成为class的一个成员;而为了确保此常量之多只有一份实体,你必须让它成为一个 static 成员:
class GamePlayer
{
private:
static const int NumTurns=5;//常量声明式
int scores[NumTurns]; //使用常量式
....
};
通常C++要求对所使用的东西提供一个定义式。但是,在这里,如果它是个class专属常量而且又是static且为整数类型(例如:int,char,bool),则需要特殊处理。只要不取它们的地址,你就可以声明并使用它们而不需要提供它们的定义式。否则,如果要取地址或者是编译器一定要看到定义式,那么,你一定要另外提供如下定义式:
const int GamePlayer::NumTurns; //NumTurns的定义;
将这个式子放在实现文件而不是头文件中,由于NumTurns在声明的时候已经设有初值,所以在定义的时候就不用赋初值了。(旧式的编译器可能不支持在声明中赋初值,此时,可以将初值放在定义上。)万一你的编译器值允许“static整数型class常量”完成“in class 初值设定”,可以改用所谓的“the enum hack”补偿做法。于是GamePlayer 可以如下定义:
class GamePlayer
{
private:
enum{ NumTurns=5 };
int scores[NumTurns];
...
};

二、对于形似函数的宏,最好改用inline的函数替换#define。
template
inline void callWithMax (const T& a, const T& b)
{
f( a>b? a : b);
}
这个template产出一整群函数,每个函数都接受两个同型对象,并以其中较大者调用f。


总结:
1.对于单纯常量,最好以const对象或emun替换#define。
2.对于形似函数的宏,最好改用inline函数替换#define。

0 0
原创粉丝点击