在类中定义的名称(函数或数据成员)的作用域都是整个类,作用域为整个类的名称只在该类中是已知的,在类外是不可知的。
符号常量的作用域为类很有用,创建一个由所有对象共享的常量是个不错的主意。
因为声明类只是描述了对象的形式,并没有创建对象。因此,在创建对象之前,将没有用于存储值的空间。常规的声明常量的方法是不可用的。
怎么办呢?有两种方法:
1、在类中声明一个枚举。
class A{
private:
enum {num = 12};
double conts[num];
...
用这种方法声明不会创建类成员数据,所有的对象中都不包含枚举。num只是一个符号名称,在作用域为整个类的代码中遇到它,编译器将用12来代替。
这里只是创建符号常量,并不打算创建枚举类型的变量,因此不需要提供枚举名。
2、使用关键字 static
:
class A{
private:
static const int num = 12;
double conts[num];
...
会创建一个名为 num 的常量,该常量和其他静态变量存储在一起,而不是存储在对象中。因此,只有一个 num 常量,被所有 A 对象共享。
3、作用域内枚举
两个枚举中定义的枚举量可能发生冲突:
enum egg { s, m, l, J }
enum shirt { s, m, l, X }
这将出现冲突,将其作用域声明为类即可:
enum class egg { s, m, l, J }
enum class shirt { s, m, l, X }
也可用关键字 struct 代替 class,用枚举名称来限定枚举量:
egg choice =egg::l;
shirt choice = shirt :: l
枚举量的作用域为类后,就不会发生冲突了。