C++ 常量定义之我见

来源:互联网 发布:人流量统计软件 编辑:程序博客网 时间:2024/05/20 02:27

到目前为止,C++的常量定义我所知道的有这么几种:

1. #define

2. const 

3. enum


下面作一些个人总结:

1. #define CONST_VALUE value

几乎没有人推荐用的形式。

主要有下面三个问题:

a. 类型检查问题:

在我看来这个是最为人诟病的问题,因为宏替换发生在预处理阶段,因此编译器不会去检查该常量的类型,从而避免可能的错误。

当然很多时候,这个缺点并不会导致致命的错误,尤其是如#define SIZE 100 这样人畜无害的语句。

相对应的,如果是#define SPEED 1.02,那么在接下来int i = SPEED时,编译器可能不会报错,因此会导致不可预测的问题。

从这个角度上来讲,#define是有明显不足的。


b. 作用域问题:

宏定义是全局的,没有作用域的概念。

就是说,如果我再test.h 里面定义了#define SIZE 100,那么任何包含这个头文件的cpp文件都不可以对SIZE有别的解释。

这就限制了宏定义常量一般不能放在头文件中,因为这将导致所有包含这个头文件的cpp文件的名字空间都被污染。

(而这个问题在const typename CONST_VALUE = value的形式中可以由名字空间的引入而得到解决)

如果把常量的定义放在cpp文件的头部,那么该常量的作用范围就被限制在文件内,那么这个问题所带来的困扰会小得多,除非你希望一个cpp文件里的不同部分对于同一个变量名可以有不同的解释。

然而,在一些情况中,必须将常量定义放在头文件中,包括:

你希望几个cpp文件公用的常量。

你希望在头文件中使用常量。比如数组大小的定义,自定义类的类内定义函数的实现部分。


c. 编译后的文件大小和运行速度问题:

有的文章会写到由于#define 和const 的机制不同,它们的运行效率和生成的object文件大小会 存在差异。编译原理和汇编学的都不好,我觉得这里我没有发言权。唯一想说的是,跟前面两个问题比起来,我觉得这个问题是小巫见大巫。有兴趣刨根问底的同学可以自行查找资料~


2. const 

我觉得这应该是c++里面最让人头疼的关键字了。没有之一。

因为它含义太多,所以显得扑朔迷离。这篇文章中仅仅讨论作为常量修饰符的作用。

const 的出现可以适用于所有c++的常量定义场合,配合namespace关键字,很好的解决了类型检查和作用域的问题。

此外const 还可以用来定义常量数组。因此我认为它是c++的官方常量定义法。

如果const 放在类定义的private中,以static const 修饰,可以成为类内专用的常量。

小插曲1: vs支持在头文件中定义常量,而出于封装的考虑,可以把常量定义放在实现文件中。

小插曲2: vs不允许浮点类型的静态常量成员函数在类中初始化。


3. enum

这个关键词定义常量我认为属于旁门左道,但有些人指出它更简洁。

其实我非常怀疑vs的类内定义整型静态成员常量的实现方式和enum是共用的。

果真如此,那么两个的差别可以说仅仅在static const 要多打几个字。

有的资料还说枚举常量不会占用对象的存储空间,它们在编译时被全部求值。

上面这句话是抄的,我没大看得懂。还请各路大神指点。不过看来enum还是有些别的可取之处的。

当然,限制是非常明显的。只能是int型。

原创粉丝点击