第5章 常量
常量是一种标识符,它的值在运转时代恒定稳定。C言语用 #define来界说常量(称为宏常量)。C 言语除了 #define外还可以用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 RADIUS = 100;
const float DIAMETER = RADIUS * 2;
5.4 类中的常量
偶尔我们进展某些常量只在类中无效。由于#define界说的宏常量是全局的,不能抵达目的,于是想固然地以为应该用const修饰数据成员来完成。const数据成员的确是存在的,但其寄义却不是我们所希冀的。const数据成员只在某个工具保管期内是常量,而搪塞整个类而言倒是可变的,由于类可以创建多个工具,不合的工具其const数据成员的值可以不合。
不能在类声明中初始化const数据成员。以下用法是错误的,由于类的工具未被创建时,编译器不晓得SIZE的值是什么。
>
{…
const int SIZE = 100; // 错误,诡计在类声明中初始化const数据成员
int array[SIZE]; // 错误,未知的SIZE
};
const数据成员的初始化只能在类组织函数的初始化表中休止,好比
>
{…
A(int size); // 组织函数
const int SIZE ;
};
A::A(int size) : SIZE(size) // 组织函数的初始化表
{
…
}
A a(100); // 工具 a 的SIZE值为100
A b(200); // 工具 b 的SIZE值为200
若何本事树立在整个类中都恒定的常量呢?别指望const数据成员了,应该用类中的罗列常量来完成。好比
>
{…
enum { SIZE1 = 100, SIZE2 = 200}; // 罗列常量
int array1[SIZE1];
int array2[SIZE2];
};
罗列常量不会占用工具的存储空间,它们在编译时被全部求值。罗列常量的缺陷是:它的隐含数据典型是整数,其最年夜值无限,且不能体现浮点数(如PI=3.14159)。
版权声明: 原创作品,许愿转载,转载时请务必以超链接情势标明文章 原始出处 、作者信息和本声明。不然将究查功令责任。