对于一个从未写过C ++ 11系列的人,以及目前没有机会在C ++ 11中编程的人,你能用一个简短的段落告诉我:
什么是“枚举类”,为什么我们需要它?
答案 0 :(得分:13)
enum class
称为范围的枚举。它可以防止污染枚举函出现的名称空间。
在C ++ 03中,通过将enum
置于专用class
内,您可以有效地完成相同的操作。也许这就是语法的来源,这有点令人困惑。
另一个不同之处在于,此类型的调查员不会隐式转换为int
(static_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,{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