C++11 Enum枚举使用心得

C++11 Enum使用心得

定义

和类类似,枚举定义了一种新的自定义类型,其将一组整形常量组织在一起。枚举属于字面值常量类型。

使用

在使用枚举时,需要注意以下两个方面:

  1. 根据作用域区分,枚举分为限定作用域(C++11引入)和不限定作用域两种,定义如下:
enum class DAY     //  限定作用域
{
	MONDAY,  TUESDAY,  WEDNESDAY,  THURSDAY,
	FRIDAY,  SATURDAY,  SUNDAY
};

enum MONTH     //  不限定作用域
{
	JANUARY,  FEBRUARY,  MARCH,  APRIL,  MAY,  JUNE,
    JULY,  AUGUST,  SEPTEMBER,  OCTOBER,  NOVEMBER,  DECEMBER
};

由于枚举成员是const,因此建议用定义枚举成员用大写

默认情况下,枚举值从0开始,依次加1。其好处就是在不指定专门值的情况下,枚举值基本不存在重复值,便于代码的维护。若某些值超过枚举类型所能容纳的范围,编译会产生warning警告,需注意。

在《Effective Modern C++》中,Scott Meyers建议优先使用限定作用域的枚举类型,而非限定作用域的枚举类型。原因主要有以下两个方面:

a. 限定作用域的枚举类型将名字空间污染降低,如下:

auto day = SUNDAY;  // SUNDAY被限定在DAY作用域内
auto day = DAY::SUNDAY;  // OK
auto month = JANUARY;  // OK

b. 限定作用域的枚举类型是强型别的,限定作用域的枚举类型无法通过隐式转换到其他类型,而不限定的枚举类型可以自动转换为整形。

int num = DAY::SUNDAY;  //  限定作用域的枚举类型不会进行隐式转换
int num = MONTH::JANUARY;  // OK

当然,可以使用强制类型转换static_cast实现限定作用域的枚举类型转换。

  1. 指定enum的大小

在enum中,我们可以指定enum的大小,从而优化内存。尽管每个enum都定义了自己唯一的类型,但是实际上enum是由某种整数类型表示的,从而来存储值。在C++11中,可以在enum的名字后面指定我们想该enum使用的类型,如下:

enum class DAY : uint8_t     //  限定作用域
{
	MONDAY,  TUESDAY,  WEDNESDAY,  THURSDAY,
	FRIDAY,  SATURDAY,  SUNDAY
};

当然,一旦某个枚举类型超过了该类型所能容纳的范围,编译会错误,若忽略会导致程序错误。

enum class DAY : uint8_t     //  限定作用域
{
	MONDAY,  TUESDAY,  WEDNESDAY,  THURSDAY,
	FRIDAY,  
    SATURDAY = 255,  
	SUNDAY  // 枚举值为256,但由于超过类型所能容纳的大小,值为0
};

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值