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

[C++] effective_C++_条款02

2017-09-01 13:47 239 查看

条款02:尽量用const, enum, inline代替#define

该原则言下之意是说使用编译器替换预处理器

假设你使用下面的表达式:

#define ASPECT_RATIO 1.653


记号名称ASPECT_RATIO也许从未被编译器看到,也许在编译器开始处理源代码之前它就被预处理器移走了,于是ASPECT_RATIO可能从来没进入记号表中,于是当你运用此常量但获得一个编译错误信息时,你可能不知道这个1.653是什么意思,这就是#define的坏处。

因此你可以使用一个常量来替换上述的宏:

const double AspectRatio = 1.653;


作为一个语言常量,AspectRatio肯定会被编译器看到,当然会进入记号表中

在定义常量指针时,由于常量定义通常被放在头文件中,以便被不同的源码包含,因此有必要将指针声明为const,例如若要在头文件内定义一个常量的char*字符串,需要些const两次:

const char* const authorName = "Scott Meyers";


class专属常量。为了将常量的作用域限制于class内,你必须让它成为class的一个成员,而为确保此常量至多只有一份实体,必须让它成为一个static成员:

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


通常C++要求所使用的任何变量均需提供定义式,但如果它是一个class专属常量又是static且为整数类型(integral types, ints, chars, bools),则需特殊处理,只要不取它们的地址,可以只声明并使用它们而无需提供定义式;但如果你取某个class专属常量的地址,你就必须提供下面的定义式:

const int GamePlayer::NumTurns; // 定义


在C++中,在默认情况下,全局变量的链接性是外部的,但const全部变量的链接性是内部的,也就是说,在C++看来,全局const定义就像使用了static说明符一样。

全局变量在多线程中容易出问题, 一份优秀的代码是几乎不出现全局变量的

一个属于枚举类型的数值可当做ints使用,即”the enum hack”

class GamePlayer{
enum {NumTurns = 5};
int scores[NumTurns];
};


the enum hack 技术的好处:

当你不想让别人获得一个pointer或reference指向你的某个整数常量时,enum可以实现

enum和#define不会导致非必要的内存分配
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++