有时候我们希望某些常量只在类中有效,而#define定义的宏常量是全局的,不能达到我们的要求。非静态const数据成员是属于每一个对象的成员,只在某个对象的生存期内是常量,而对于整个类来说它是可变的,除非是static const。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。
不能在类声明中初始化非静态const数据成员
- 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(200);//对象b的SIZE值为200
怎样才能建立在整个类中都恒定的常量呢?用枚举常量来实现
- class A
- {
- ...
- enum
- {
- SIZE1 = 100,//枚举常量
- SIZE2 = 200
- };
- int array1[SIZE1];
- int array2[SIZE2];
- };
枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是不能表示浮点数和字符串。