目录
第5章 常量
C语言用#define来定义常量,称为宏常量
C++语言除了#define外还可以用const来定义常量
5.1 为什么要使用常量
(1)程序的可读性
(2)程序很多地方输入同样数字或者字符串,难保不发生错误
(3)如果要修改数字或字符串,在很多地方修改,容易出错
(1)尽量使用含义直观的常量来表示
#define MAX 100 //C语言的宏常量
const int MAX = 100; //C++语言的const常量
const float PI = 3.1415 ; //C++语言的const常量
5.2 const 与 #define的比较
const与#define变量,前者比后者有更多 有点:
(1)const 常量有数据类型,宏常量没有数据类型,编译器可以对前者进行类型检查,后者只有字符替换,可能出现意想不到的错误
(2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量调试
(3)C++程序中,只是用const, 不使用宏,因为const常量可以完全取代宏 常量
5.3 常量定义的规则
(1)需要对外公开的常量放在头文件中,不需要公开的常量放在定义文件的头部,可以把不同模块常量几种存放在一个公共头文件中
(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
};
class A
{
A(int size); //构造函数
const int SIZE;
};
A::A(int size):SIZE(size) //构造函数的初始化表
{
...
}
A a(100);//对象a的SIZE为100
A b(100);//对象a的SIZE为200
怎么在整个类中恒定常量呢?枚举!
class A
{
enum {SIZE1 = 100, SIZE2 = 200};
int array1[SIZE1];
int array2[SIZE2];
};
枚举常量不会占用对象存储空间,但是隐含数据类型必须是整数,且最大值有限,不能表示浮点数