枚举类型enum和enum class的区别
本文最后更新于 66 天前,其中的信息可能已经有所发展或是发生改变。

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++中的显式转换后赋值。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇