重读金典------高质量C编程指南(林锐)-------第五章 常量
5.1 为什么需要常量
1)为了便于用户理解,增加程序的可读性。
2)在程序的很多地方都用到同一个常量,用某一个宏常量来定义可以减少错误。
规则:尽可能的使用含义直观明确的常量来表示程序中多次出现的数字或者字符串
5.2 #define vs const
一般在C里面一般用#define,而在C++中,更喜欢用const,因为const有很多类型。而define没有类型检查这一说,只是单纯的进行字符替代。
规则:C++中,程序一般使用const常量而不使用宏常量,即const常量完全取代宏常量。
5.3 常量定义规则
规则:需要对外公开的,写在头文件里面,不需要的写在定义文件里面。 当然,有时候为方便管理,也可以存放在一个公共的头文件中。
规则:如果某一个常量与其他常量密切相关,应该在定义中包含这种关系,而不应给出一些孤立的值。
const float R = 100;
const float D = 2 * R;
5.4 类中的常量
有时候,我们希望类中的某些数据成员也是常量,但#define 是全局的,不能达到目的。const 修饰也会改变数据成员的值。因为const只在某个对象的生存期内是常量,而对于整个类确是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。
注意一点,我们不能在类声明中初始化const数据成员,因为类的对象未被创建之前,编译器不知道声明中的变量到底是多少。
但是,我们可以在类的构造函数中实现数据成员的初始化。当然,这只是针对于某个对象而言的。在对象未被实例化之前,类是没有分配空间的。
class A
{
enum{SIZE1 = 100, SIZE2 = 200;}//枚举常量
int array1[SIZE1];
int array2[SIZE2];
}
枚举常量不会占用对象的存储空间,他们在编译时被全部求值。缺点是:只能表示整数值,且最大值有限,不可表示浮点数。