高质量C++C编程指南
第五章常量
常量是一种标识符,它的值在操作过程中保持不变。c使用#define来定义常量(称为宏常量)。除了#define,C++语言还可以使用const来定义常量(称为const常量)。
5.1为什么需要常量
如果不使用常量,只是在程序中填入数字或字符串,会有什么麻烦?
(1)程序的可读性(可理解性)变差。程序员会忘记那些数字或字符串是什么意思,用户也不知道它们从哪里来,也不知道它们意味着什么。
(2)在程序中多处输入相同的数字或字符串,很难保证不出现书写错误。
(3)如果要修改数字或字符串,会在很多地方修改,比较麻烦,容易出错。
l[规则5-1-1]尽量用直观的常数来表示程序中会多次出现的数字或字符串。
例如:
# define MAX 100/* C语言的宏常量*/
const int MAX = 100;//c++语言的const常量
const float PI = 3.14159;// C++语言的const常量
5.2 const和#define的比较
C++语言可以用const定义常量,也可以用#define定义常量。但前者比后者更有优势:
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以检查前者的类型安全。而后者只进行字符替换,不进行类型安全检查,字符替换可能出现意外错误(边际效应)。
(2)有些集成调试工具可以调试const常量,但不能调试宏常量。
l[规则5-2-1]在C++程序中,只用const常量代替宏常量,即const常量完全代替宏常量。
5.3常量定义规则
l[规则5-3-1]需要公开的常量放在头文件中,不需要公开的常量放在定义文件的头中。为了便于管理,不同模块的常量可以存储在一个公共头文件中。
l[规则5-3-2]如果一个常数与其他常数密切相关,那么这个关系就应该包含在定义中,而不是给出一些孤立的值。
例如:
const float半径= 100;
常量浮动直径=半径* 2;
5.4类中的常量
有时我们希望某些常量只在类中有效。因为#define定义的宏常量是全局的,不能达到目的,所以数据成员理所当然要用const来修饰。Const数据成员确实存在,但是它们的意义并不是我们所期望的。Const数据成员只在一个对象的生存期内是常量,但在整个类中是变量,因为一个类可以创建多个对象,不同对象的const数据成员的值可以不同。
const数据成员不能在类声明中初始化。下面的用法是错误的,因为当类的对象没有被创建时,编译器不知道SIZE的值是什么。
A类
{…
const int SIZE = 100;//错误,试图在类声明中初始化const数据成员
int array[SIZE];//错误,未知大小
};
const数据成员的初始化只能在类构造函数的初始化表中进行,例如
class A
{…
A(int size);//构造函数
const int SIZE;
};
A::A(int size):size(size)//构造函数初始化表
{
…
}
A A(100);//对象A的大小值为100
A b(200);//对象B的大小值为200
。怎样才能在全班建立一个常数?不要指望const数据成员,应该通过枚举类中的常量来实现。例如
a类
{…
enum {size1 = 100,size 2 = 200 };//枚举常数
int array 1[size 1];
int array 2[size 2];
};
枚举常量不占用对象的存储空,都是在编译时计算的。枚举常数的缺点是其隐含的数据类型为整数,取值有限,不能表示浮点数(如PI=3.14159)。
0条评论