【C++】枚举的升级版本:作用域内枚举

传统的枚举存在一些问题,其中之一是两个枚举定义中的枚举量可能发生冲突:

enum egg {Small , Medium , Large , Jumbo};
enum t_shirt {Small , Medium , Large , Jumbo};

这将无法通过编译,因为egg Small和t_shirt Small位于相同的作用域内,它们将发生冲突。为避免这种问题,C++11提供了一种新枚举,其枚举量的作用域为类。这种枚举的声明类似于下面这样:

enum class egg {Small , Medium , Large , Jumbo};
enum class t_shirt {Small , Medium , Large , Jumbo};

也可使用关键字struct代替class。无论使用哪种方式,都需要使用枚举名来限定枚举量:

egg choice = egg::Large;
t_shirt Floyd = t_shirt::Large;

在有些情况下,常规枚举将自动转换为整型,但作用域内枚举不能隐式地转换为整型,必须显式转换:

enum egg {Small , Medium , Large , Jumbo};
enum class t_shirt {Small , Medium , Large , Jumbo};
egg one = Small;
t_shirt two = t_shirt::Small;
int king = one;//OK
int ring = two;//NOK

默认情况下,C++11作用域内枚举的底层类型为int。也可以显式的改动底层类型:

enum class : short pizza {Small,Medium};

:short将底层类型指定为short,但指定的底层类型必须为整型。

猜你喜欢

转载自blog.csdn.net/weixin_43717839/article/details/129914685