c++11 enum使用心得

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

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

根据作用域区分,枚举分为限定作用域(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实现限定作用域的枚举类型转换。

指定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
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值