什么是枚举类,我为什么要关心?

时间:2012-12-26 14:05:30

标签: c++ c++11 enums enum-class

对于一个从未写过C ++ 11系列的人,以及目前没有机会在C ++ 11中编程的人,你能用一个简短的段落告诉我:

什么是“枚举类”,为什么我们需要它?

4 个答案:

答案 0 :(得分:13)

enum class称为范围的枚举。它可以防止污染枚举函出现的名称空间。

在C ++ 03中,通过将enum置于专用class内,您可以有效地完成相同的操作。也许这就是语法的来源,这有点令人困惑。

另一个不同之处在于,此类型的调查员不会隐式转换为intstatic_cast<int>是必需的)。这可能很少需要,但它使得int参数采用enum类型的函数重载是安全的。您可以确定int不会被意外调用。或者您可以使用专用的operator函数定义伪积分类型,并确保内置运算符不会干扰。

令人讨厌的是,这两个不相关的差异出现在同一个包中,并且您无法获得无范围枚举而没有隐式转换,但通常两个更改都是Good Things和enum class是C ++ 11中的一个很好的默认实践。

编辑:范围内的枚举定义如下:

enum class duck { huey, dewey, louie };

并且必须与范围解析运算符::一起使用,如下所示:

duck culprit = duck::huey; // or "auto culprit" to avoid redundancy

请注意,::运算符也适用于C ++ 03 unscoped枚举,因此即使第一行缺少class,上面的第二行也能正常工作。

这可能过于详细,但如果转发声明枚举类型,则class不会进入 elaborated-type-specifier ,如

void quack( enum duck whom ); // not "enum class"

但是,C ++ 11中有一个构造新的 opaque-enum-declaration ,它包含class关键字并定义了一个完整的类型。

enum duck; // duck is declared as incomplete type
enum class duck; // duck is now complete type; underlying type defaults to int

关键字struct可以代替class,没有语义差异。

答案 1 :(得分:0)

  1. 您可以在数据大小很重要时明确指定存储类型(可能将其打包在结构中)。
  2. 枚举值的范围仅限于枚举的名称;在c ++ 11之前,他们泄漏到了封闭的范围内。
  3. 我似乎记得转换规则也有所改变......
  4. 关于第一点1,{C} 11之前enum s的存储大小会发生变化,具体取决于分配给枚举的最大值。通常它并不重要,但是当它发生时,你必须求助于丑陋的黑客来强迫它的大小。

    至于点 3 ,在C ++ 11 enum中不能隐式转换或与int或其他enum类型相比:避免函数重载头痛和其他隐式转换陷阱。

答案 2 :(得分:0)

我个人在基于tcp的消息传递协议中使用过它:许多字段都是枚举值,我只需要在一个字节内编码 ,以便尊重消息传递接口..

我所有的枚举都是这样定义的:

enum class EnumFieldA : unsigned char { eValProperty1, eValProperty2};
enum class EnumFieldB : unsigned char { eValProperty1, eValProperty2, eValProperty3};
enum class EnumFieldC : unsigned char { eValProperty1, eValProperty2, eValProperty3, eValProperty4};
...

this SO question中也有很多彻底的答案。

答案 3 :(得分:-1)

起初我对你的问题感到困惑,但我想你想知道c ++枚举与c ++ 11之间的区别。在我能理解的最好的情况下,在后面,你有强类型的枚举,允许你对它们进行范围调整。我认为this解释得很好。 CHEERS