作用域分为:
全局(文件)作用域
、局部(代码块)作用域
和类作用域
三种。
1.作用域为类的常量
1.在类中声明的枚举的作用于为整个类,用这种方式创建枚举并不会创建类数据成员,如下,
class Test { private: enum{Months = 1008611}; public: };
2.使用关键字static来创建,如下
Months
常量将于其它静态变量存储在一起,不是存储在对象中。因此只有一个Months
常量被所有Test
共享。,
static const int Months = 12;
2.作用域内枚举
传统的枚举,枚举量可能会发生冲突,即不同的枚举内不能有相同的枚举量,因为它们位于同一个作用域内。
如下图:
但是,如声明一种新枚举,其枚举量的作用于为类,如下:
enum class egg{pdd1,pdd2,pdd3};
enum class lol{pdd1,pdd2,pdd3};
enum struct lck{pdd1,pdd2,pdd3};
我们可以在枚举名前面加上class
关键字,也可以使用struct
来替代。但是无论使用那种方式,就要使用枚举名来限定枚举量,即如下样式:
egg lpl = egg::pdd3;
lol lspl = lol::pdd2;
这样在不同枚举内相同的枚举名就不会发生冲突了。
在C++11的标准中,还提高了作用域内枚举的类型安全。在有些情况下,比如将枚举赋值给int变量或用于比较表达式,常规枚举将自动转化为整型,但是,作用域内枚举(使用枚举名来限定枚举量之后)不能隐式地转化为整型,会报错。
如下:
enum egg_old {Small , Large , XXL};
enum class t_shirt {Small , Large , XXL};
egg_old faker = Large;
t_shirt ttt = t_shirt::Large;
int lck = faker;//
/*
int lpl = ttt;
ERROR: Cannot initialize a variable of type 'int' with an lvalue of type 't_shirt'
*/
if (lck < Small) {
//do something
}
/*
if (ttt > XXL) {
ERROR:Invalid operands to binary expression ('t_shirt' and 'int')
}
*/
但是如果需要,可以进行强制的显式类型转换,如下:
int lcs = int(t_shirt::Large);
int lpl = int(ttt);
if (int(ttt) > XXL) {
}
枚举用某种底层整型类型表示时,在C++11标准中,默认的情况下作用内枚举的底层类型为int
,但是也可以指定类型(前提必须是整型类型),如下,
enum class:short lpl { Small, Large, Jumbo,};