【高质量C/C++编程】—— 5. 常量
如果不使用常量,直接在程序中填写数字或字符串,会有什么麻烦
- 程序的可读性变差。程序员会忘记那些数字或字符串是什么意思,用户更不知道它们表示什么
- 在程序的很多地方输入同样的数字或字符串,很容易发生书写错误
- 要修改数字或字符串,需要在每一个出现它的位置都进行改动
规则:
#define MAX 100 // 宏常量
const int MAX = 100; // const常量
const float PI = 3.14159;
const
常量具有数据类型,而宏常量没有。编译器可以对const
常量进行类型安全检查,而宏常量只是字符替换,没有安全类型检查,而且在替换中容易出现意料不到的错误。const
常量进行调试,但无法对宏常量调试建议:
const
常量,而不使用宏常量#define MAX 100 // 不推荐使用
const int MAX = 100; // 推荐使用
规则:
const float RADIUS = 100;
const float DIAMETER = RADIUS * 2; // 良好的风格,给出DIAMETER与RADIUS的二倍关系
const float DIAMETER = 200; // 不良的风格,孤立的值容易让人忽略二者的联系
有时候我们希望某些常量只在类中有效,由于#define
定义的宏常量是全局的,所以我们就会想到使用const
修饰成员变量实现。
const
成员变量的确存在,但是含义却并不是我们期望的,const
数据成员只在某个对象的生存周期内是常量,对于整个类是可变的,因为类可以创建多个对象,不同对象的const
变量值可以不同。
规则:
const
数据成员,类对象未创建之前成员变量没有内存。// 错误的const成员变量
class A
{
const int SIZE = 100; // 错误,企图在类声明中初始化const成员变量,SIZE未分配内存
int arr[SIZE]; // 错误,SIZE不存在
};
const
成员变量只能在类的构造函数的初始化表中进行// 类的声明
class A
{
A(int size);
const int SIZE;
};
// 构造函数的定义
A::A(int size) : SIZE(size) // 初始化列表
{
... ...
}
const
成员变量了,应该用类中的枚举常量来实现
- 枚举常量的优点是不会占用对象空间,编译期全部被求值。
- 缺点是它的隐含数据类型是整型,最大值有限,且不能表示浮点数。
class A
{
enum { SIZE1=100, SIZE2=200 }; // 枚举常量
int array1[SIZE1];
int array2[SIZE2];
};