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

What's an enum class and why should I care?

本文关键字:为什么 关心 枚举 什么      更新时间:2023-10-16

对于一个从来没有写过一行c++ 11,而且目前没有机会用c++ 11编程的人来说,你可以,在一个简短的段落中。,告诉我:

什么是"enum类",为什么我们需要它?

enum class称为作用域枚举。它可以防止用枚举数的名称污染出现枚举的命名空间。

在c++ 03中,您可以通过将enum放入专用的class中来有效地完成相同的事情。也许这就是语法的来源,这有点令人困惑。

另一个区别是这种类型的枚举数不会隐式地转换为int(需要static_cast<int>)。这可能很少需要,但它使得使用enum类型重载int参数的函数是安全的。可以确定int不会被意外调用。或者您可以使用专用的operator函数定义伪整型,并确保内置操作符不会干扰。

这两个不相关的差异出现在同一个包中有点令人恼火,并且您无法在没有隐式转换的情况下获得无作用域的枚举,但通常这两个更改都是好事,enum class是c++ 11中一个很好的默认实践。

EDIT:一个限定范围的枚举是这样定义的:

enum class duck { huey, dewey, louie };

必须与作用域解析操作符::一起使用,如下所示:

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

请注意,::运算符也适用于c++ 03的无作用域枚举,因此即使第一行缺少class,上面的第二行也可以工作。

这可能是过多的细节,但是class没有进入详细的类型说明符,如果前向声明枚举类型,如
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. 当数据大小很重要时,可以显式指定存储类型(可能将其打包在结构体中)。
  2. 枚举值仅在枚举的名称范围内;在c++11之前,它们泄漏到封闭作用域中。
  3. 我似乎记得转换规则也有所改变…

相对于第一点1,enum s的存储大小在c++ 11之前会根据分配给枚举的最大值而改变。通常情况下,这并不重要,但当它发生时,你不得不诉诸丑陋的hack来强制大小。

关于3,在c++ 11中,enum类型不能隐式转换,也不能与int或其他enum类型进行比较:这有助于避免函数重载问题和其他隐式转换问题。

我个人在基于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};
...

在这个问题中也有很多详尽的答案。

起初我对你的问题感到困惑,但我认为你想知道c++枚举与c++11中的枚举之间的区别。据我所知,在后一种情况下,你有强类型的枚举,这允许你对它们进行范围控制。我认为这很好地解释了它。欢呼声