作用域内枚举

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

enum egg {Small, Medium, Large, Jumbo};
enum t_shirt {Small, Medium, Large, Xlarge};
这将无法通过编译(egg Small和t_shirt Small发生冲突)

解决办法(新枚举): C++11提供了一种新枚举,其枚举量的作用域为类:

enum class egg {Small, Medium, Large, Jumbo};
eum class t_shirt {Small, Medium, Large, Xlarge};
可使用关键字struct代替class
使用时需使用枚举名来限定枚举量:

egg choice = egg::Large;
// the Large enumerator of the egg enum

t_shirt Floyd = t_shirt::Large;
// the Large enumerator of the t_shirt enum

C++11提高了作用域内枚举的类型安全: 有时,常规枚举将自动转换为整型,如将其赋给int变量或用于比较表达式时,但作用域内枚举不能隐式地转换为整型:

enum egg_old {Small, Medium, Large, Jumbo}; // unscoped

enum class t_shirt {Small, Medium, Large, Xlarge}; // scoped

egg_old one = Medium; // unscoped

t_shirt rolf = t_shirt::Large; // scoped

int king = one; // implicit type conversion ofr unscoped
int ring = rolf; // not allowed, no implicit type conversion

if (king < Jumbo) // allowed
std::cout<<“Jumbo converted to int before comparison.\n”;

if (king < t_shirt::Medium) // not allowed
std::cout<<“Not allowed: < not defined for scoped enum.\n”;

但在必要时,可显示类型转换:
int Frodo = int(t_shirt::Small); // Frodo set to 0

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值