什么是枚举类,我为什么要关心?
What's an enum class and why should I care?
对于一个从来没有写过一行c++ 11,而且目前没有机会用c++ 11编程的人来说,你可以,在一个简短的段落中。,告诉我:
什么是"enum类",为什么我们需要它?
enum class
称为作用域枚举。它可以防止用枚举数的名称污染出现枚举的命名空间。
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
,没有语义差异
- 当数据大小很重要时,可以显式指定存储类型(可能将其打包在结构体中)。
- 枚举值仅在枚举的名称范围内;在c++11之前,它们泄漏到封闭作用域中。
- 我似乎记得转换规则也有所改变…
相对于第一点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中的枚举之间的区别。据我所知,在后一种情况下,你有强类型的枚举,这允许你对它们进行范围控制。我认为这很好地解释了它。欢呼声
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 为什么BKDFHash不关心超出范围的问题?
- 为什么我们不关心位顺序?
- 为什么printf函数家族关心区域设置
- 为什么 C# 似乎不关心一致性?
- 为什么我应该关心boost文档中的EXTENSION注释
- 为什么Malloc()关心边界对齐
- 什么是枚举类,我为什么要关心?
- 为什么这个自动矢量化器关心构造函数/析构函数