【高质量C/C++】5.常量

【高质量C/C++编程】—— 5. 常量

一、为什么需要常量

如果不使用常量,直接在程序中填写数字或字符串,会有什么麻烦

  1. 程序的可读性变差。程序员会忘记那些数字或字符串是什么意思,用户更不知道它们表示什么
  2. 在程序的很多地方输入同样的数字或字符串,很容易发生书写错误
  3. 要修改数字或字符串,需要在每一个出现它的位置都进行改动

规则

  • 尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串
#define		MAX		100		// 宏常量
const int	MAX	= 100;		// const常量
const float	PI = 3.14159;

二、const与#define的比较

  1. const常量具有数据类型,而宏常量没有。编译器可以对const常量进行类型安全检查,而宏常量只是字符替换,没有安全类型检查,而且在替换中容易出现意料不到的错误。
  2. 有些集成化调试工具可以对const常量进行调试,但无法对宏常量调试

建议

  • 在编程时尽量使用const常量,而不使用宏常量
#define MAX 100			// 不推荐使用
const int MAX = 100;	// 推荐使用

三、常量定义规则

规则

  1. 对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为了便于管理,可以把不同模块的常量集中在一个公共的头文件中
  2. 如果一个常量与其他常量密切相关,应在定义中包含这些关系,而不是给出孤立的值。
const float RADIUS = 100;

const float DIAMETER = RADIUS * 2;	// 良好的风格,给出DIAMETER与RADIUS的二倍关系
const float DIAMETER = 200;			// 不良的风格,孤立的值容易让人忽略二者的联系

四、类中的常量

有时候我们希望某些常量只在类中有效,由于#define定义的宏常量是全局的,所以我们就会想到使用const修饰成员变量实现。

const成员变量的确存在,但是含义却并不是我们期望的,const数据成员只在某个对象的生存周期内是常量,对于整个类是可变的,因为类可以创建多个对象,不同对象的const变量值可以不同。

规则

  1. 不能在类的声明中初始化const数据成员,类对象未创建之前成员变量没有内存。
// 错误的const成员变量
class A
{
    const int SIZE = 100;	// 错误,企图在类声明中初始化const成员变量,SIZE未分配内存
    int arr[SIZE];			// 错误,SIZE不存在
};
  1. const成员变量只能在类的构造函数的初始化表中进行
// 类的声明
class A
{
    A(int size);
    const int SIZE;
};

// 构造函数的定义
A::A(int size) : SIZE(size)		// 初始化列表
{
    ... ...
}
  1. 建立在整个类中都恒定的常量就别指望const成员变量了,应该用类中的枚举常量来实现
  1. 枚举常量的优点是不会占用对象空间,编译期全部被求值。
  2. 缺点是它的隐含数据类型是整型,最大值有限,且不能表示浮点数。
class A
{
    enum { SIZE1=100, SIZE2=200 };	// 枚举常量
    int array1[SIZE1];
    int array2[SIZE2];
};

猜你喜欢

转载自blog.csdn.net/weixin_52811588/article/details/127114259