此系列文章实为对《高质量程序设计指南--C++/C语言》的重点摘要总结
本篇总结的为常量
为什么需要常量?
这个问题可以换成为什么不直接使用数字或字符串:
- 会使程序的可读性变差。就算程序员自己都可能会忘记了那些数字或字符串是什么意思,更别说阅读者了(哪怕有注释)
- 在程序中多处引用同样的数字或字符,难免出现错误
- 如果需要修改,而同一数字或字符又在很多的地方被使用。这样会使工作量增大,而且还不能确保修改每一处都没有错误
const 与 #define 的比较
C++ 可以使用两者定义常量,但是前者优点更多
- 前者有数据类型,而后者没有。而编译器可以对前者进行类型安全检查,而对后者只是字符替换,没有安全检查
- 有些集成化的调试工具可以对 const 常量进行调试,但不能对宏常量进行调试
在C++中通常使用 const 完全替代宏常量
常量定义规则
- 需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中
- 如果某一常量与其他常量密切相关,应在定义中包含这种关系,而不是给出一些孤立的值
例如: const float RADIUS = 100;
const float DIAMETER = RADIUS * 2;
类中的常量
- 有些时候我们希望某些常量只在类中有效,而 #define 是全局性的,当然不能了。那么就使用 const 吧。可惜的是,const 数据成员是存在的,只是其含义不是我们所期望的。
- const 数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同对象其 const 数据成员的值可以不同。
那么怎样才能建立在整个类中都恒定的常量呢? 答案是使用 枚举常量
class test
{
enum { SIZE1 = 100, SIZE2 = 200 };
int array1[SIZE1];
int array2[SIZE2];
};
枚举常量不会占用对象存储空间,它们在编译时被全部求值。
但是其存在一个缺点: 它的隐含数据类型是整数,其最大值有限,且不能表示浮点数