1 enum class定义

在传统 C++ 中,枚举类型并非类型安全,枚举类型会被视作整数,则会让两种完全不同的枚举类型可以进行直接的比较, 甚至枚举类型的枚举值名字不能相同。

C++11引入了枚举类, 使用enum class进行定义。枚举类不能够被隐式的转换为整数,同时也不能够将其与整数数字进行比较,更不可能对不同的枚举类型的枚举值进行比较。但相同枚举值之间如果指定的值相同,那么可以进行比较:

  1. enum class new_enum
  2. value1 ,
  3. value2 ,
  4. value3 = 100 ,
  5. value4 = 100
  6. };
  7. //比较
  8. if ( new_enum :: value3 == new_enum :: value4 ) {
  9. // 输出
  10. std :: cout << " new_enum :: value3 == new_enum :: value4 " << std :: endl ;
  11. }

2 非int型的enum

枚举类默认是int类型,也可以指定其他整型相关的类型,格式如下:

  1. enum class Punctuation : char
  2. {
  3. Comma = ',',
  4. Exclamation = '!',
  5. Question='?'
  6. };

3 导入枚举类命名空间

从上面的例子可以看出,使用枚举类的值时,必须使用**类名::值**的格式,和传统C++中enum结构不一样了。如果需要直接引用枚举值,有一个简单的方法:导入枚举类命名空间

  1. enum class Day { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };
  2. using enum Day; // All Day enumerators can be used without specifying 'Day::'
  3. Day today = Friday; // Compiles now (of course, Day::Friday would still work as well)

当然这是using的功能,并不是枚举类独有的。(参照using的三个功能:1 类型与声明)。