天天看点

C++11 Enum枚举使用心得C++11 Enum使用心得

转载:https://blog.csdn.net/lxhw1018/article/details/83217703

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

继续阅读