高质量C++/C编程指南 之 常量

 

常量

 C语言中用#define来定义常量(称为宏常量)。C++语言除了用#define外还可以用const来定义常量(称为const常量)。

【规则 5-1-1 尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串。

如:#define MAX 100             /* C 语言的宏常量 */

const int MAX = 100;          // C++ 语言的 const 常量

const float PI = 3.14159;       // C++ 语言的 const 常量

 

const#define的比较

const#define有更多的有点

1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,无类型安全检查,并可能在字符替换产生意想不到的错误。

2) 有些集成的调试工具可以对const常量进行调试,但不能对宏常量进行调试。

【规则 5-2-1 C++ 程序中只使用 const 常量而不使用宏常量,即 const 常量完全取代宏常量。

 

常量定义规则

【规则 5-3-1 需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。

【规则 5-3-2 如果某一常量与其它常量密切相关,应在定义中包含这种关系, 而不应给出一些孤立的值。

如: const float RADIUS = 100;

const float DIAMETER = RADIUS * 2;

 

类中的常量

const 数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其 const 数据成员的值可以不同。不能在类声明中初始化 const 数据成员。

如: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)。

posted on 2010-02-03 11:08  Lowtec  阅读(216)  评论(0编辑  收藏  举报

导航