高质量C++/C编程指南-第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的值是什么。
class A
{…
const int SIZE = 100; // 错误,诡计在类声明中初始化const数据成员
int array[SIZE]; // 错误,未知的SIZE
};
const数据成员的初始化只能在类结构函数的初始化表中举办,譬喻
class A
{…
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数据成员了,应该用类中的列举常量来实现。譬喻
class A
{…
enum { SIZE1 = 100, SIZE2 = 200}; // 列举常量
int array1[SIZE1];
int array2[SIZE2];
};
列举常量不会占用工具的存储空间,它们在编译时被全部求值。列举常量的缺点是:它的隐含数据范例是整数,其最大值有限,且不能暗示浮点数(如PI=3.14159)。