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

栏目: C++ · 发布时间: 5年前

内容简介:这个条款也可以改为“可以用编译器替换预处理器”,因为#define有很多的问题和不方便之处。当你使用了这个常量但获得一个编译错误信息时,可能会带来困惑,因为错误信息会提到1.6454 而不会提到名称本身,尤其是这个量又别人或在另外一个头文件中定义就更麻烦了。而改为

这个条款也可以改为“可以用编译器替换预处理器”,因为#define有很多的问题和不方便之处。

#define ASPEC 1.6454

当你使用了这个常量但获得一个编译错误信息时,可能会带来困惑,因为错误信息会提到1.6454 而不会提到名称本身,尤其是这个量又别人或在另外一个头文件中定义就更麻烦了。

而改为 const double ASPEC = 1.6454 就不会出现这种情况。

当const、指针结合在一起时应该注意‘*’与const的相对位置;

另一个要注意的问题是如果你想在class中设立这样一个作用域为这个类的变量,则让它成为一个static成员:

class G
{

static const int num = 5;
int sc[num];

};

然而,num是常量的声明式而非定义式,通常C++要求你对你所使用的任何东西提供一个定义式。

但如果它是一个class专属常量又是static,且为整数类型(integral type,例如int,char,bool),则需特殊处理。

只要不取它们的地址,你可以声明并使用它们而无须提供定义式。

但如果你取某个class专属常量的地址,或纵使你不取其地址但是编译器却(不正确的)坚持要看到一个定义式,

你就必须另外提供定义式如下:

const int G::num;

·#define是不提供任何封装的,也就是说没有private #define之类的东西,但是const可以。

另一个好用的东西是enum hack.像在类中加入下面的代码:

enum{Nun = 5};

用Nun作为5的一个代称,而且可以避免用指针来获取你的整数常量的地址,enum可以完成这个约束。而且它很实用,经常会用到。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

乌合之众

乌合之众

(法)勒庞 / 冯克利 / 中央编译出版社 / 2011-5-1 / 16.00元

古斯塔夫・勒庞 Gustave Le Bon(1841-1931) 法国著名社会心理学家。他自1894年始,写下一系列社会心理学著作,以本书最为著名;在社会心理学领域已有的著作中,最有影响的,也是这本并不很厚的《乌合之众》。古斯塔夫・勒庞在他在书中极为精致地描述了集体心态,对人们理解集体行为的作用以及对社会心理学的思考发挥了巨大影响。《乌合之众--大众心理研究》在西方已印至第29版,其观点新颖,语......一起来看看 《乌合之众》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具