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型。
- C++ 常量定义之我见
- 引用常量之我见
- [C++]常量定义
- C语言定义常量
- 【C++】定义常量
- c++/cli之我见
- 【C#】c#之我见
- C语言中宏定义中#和##之我见以及其在嵌入式中的简单运用
- 正确定义Objective-C常量
- C语言整形常量定义
- 正确定义Objective-C常量
- c语言 数组定义 符号常量定义
- C++、C++学习之我见
- C++、C++学习之我见
- C++、C++学习之我见
- c语言变量之我见
- C/C++ Const之我见
- c++socket模型之我见
- 线性表创建插入删除及各种排序算法实现
- 素数与字符串匹配问题
- 如何制作动态统计图的模板
- freemark标签常用示例
- 对应届生求职简历的建议,怎么能快速得到面试的机会
- C++ 常量定义之我见
- 取球游戏_nyoj_518(博弈-蓝桥杯原题).java
- 不要忘了初衷
- win2000注册表权限选项添加
- 约瑟夫问题(转载)
- SOJ 1052. Candy Sharing Game
- 寄存器与内存访问
- 不显示市场价
- MSSQLSERVER服务无法启动的解决方案