转载:https://blog.csdn.net/lxhw1018/article/details/83217703
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
};