1. 枚举enum
传统的枚举类型,帮助开发者快速定义一系列整形常量。关于枚举类型的介绍和使用在这里不再过多介绍,示例如下:
class MyClass{
public:
enum Color {
RED, // 0
GREEN, // 1
BLUE // 2
};
};
相比于enum class的特点:
-
enum的成员直接暴露在其定义的作用域中,不允许再定义一个同名变量。如上例中
RED
实际上就是MyClass::RED
(在本类中使用可省略类名),如果再MyClass类中再定义一个int RED
就会冲突。 -
使用enum定义的枚举类型可以直接当作整形变量使用,默认支持很宽松的隐式类型转换,但也要注意,支持enum类型隐式转换成int类型,但不支持int类型反向隐式转换为enum类型。如上例,可以直接如下使用:
int red = MyClass::RED; if(red == MyClass::RED){...} MyClass::Color color; color = MyClass::GREEN; color = 2; // MyClass::BLUE if(color == 2){...}
-
习惯上(并非固定),将枚举类型的命名使用首字母大写的驼峰命名法,而枚举成员使用全大写加下划线分割的方式(同常量的命名)。
-
如果在Qt中使用就很方便的使用在需要暴露给QML的变量,在QML中使用此类枚举变量就直接用int类型赋值、读取即可。
2. 枚举类enum class
C++11引入的新枚举类型,其通过限定作用域和增强类型安全性解决了传统 enum的一些问题。示例如下:
class MyClass{
public:
enum class Color {
red, // 0
green, // 1
blue // 2
};
};
相比于enum的对应特点:
-
enum class的成员不会直接暴露在其定义的作用域中,而是必须需要枚举类型名去限定访问,那么在同一个类下就不必顾虑与枚举类型成员命名冲突的问题了。如上例中
red
在本类中只能使用Color::red访问
,在其他类中只能使用MyClass::Color::red
访问。 -
使用enum class定义的枚举类型不支持隐式转换,只能显式转换,那么也就无法直接使用int类型赋值、比较、输出等。如上例中的enum class类型必须如下使用。
int x = MyClass::Color::red; // 错误 int x = static_cast
(MyClass::Color::red); // 正确,显式转换 auto y = MyClass::Color; y = 1; // 错误 y = MyClass::Color::green; // 正确 if(y == 1){...} // 错误 if(y == MyClass::Color::green){...} // 正确 -
允许允许显式指定底层类型(如 int、char 等)。如指定为char类型:
enum class Color : char { Red, Green, Blue };
-
习惯上(并非固定),将枚举类型的命名使用首字母大写的驼峰命名法(同类的命名),而枚举成员使用首字母小写的驼峰命名法(同普通变量的命名)。
-
那么在Qt中,因为以上严格限制的特点,也就不方便暴露给QML中使用,QML中不方便获取到枚举类型名进行赋值,也不方便使用C++中的显式转换后赋值。