什么是枚举类,以及为什么要在乎?(What's an enum class and why

2019-07-17 14:36发布

对于一个从来没有谁写过一行C ++ 11,谁拥有,此刻,没有机会在编程C ++ 11,你可以在一个短款,告诉我:

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

Answer 1:

enum class被称为作用域枚举 。 它可以防止污染,其中枚举出现与统计员的名字命名空间。

在C ++ 03,你可以通过将有效地做同样的事情enum专用的内部class 。 也许这就是语法,这是一个比较混乱的根源。

另一个区别在于,这种类型的枚举不隐式转换为intstatic_cast<int>是必需的)。 这可能是很少用到 ,但它使得安全重载一个函数获取int参数与一个了结enum类型。 你可以肯定的int不会被意外的调用。 或者,你可以定义伪积分类型的专用operator功能,并确保内置运营商不会干涉。

这是一个有点恼人的是走在了同一个包这两个不相关的差异,而且你不能没有隐式转换的未范围枚举,但一般都变化是好事, enum class是C ++ 11的好做法默认。

编辑:甲作用域枚举的定义如下:

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, 不透明-枚举声明 ,它不包含新的构建体class关键字和定义了一个完整的类型。

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

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



Answer 2:

  1. 当数据的大小是很重要的(在一个结构包装它也许)可以明确指定存储类型。
  2. 枚举值枚举的名称中范围的; C ++ 11之前它们泄漏到封闭的范围。
  3. 我似乎记得转换规则也有所改变......

相对于指向一个1,的存储大小enum s就根据分配给一个枚举最大值之前C ++ 11改变。 通常它不要紧这么多,但是当它你不得不求助于丑黑客给力的大小。

至于第3点,在C ++ 11 enum s为不隐式转换或相当于int S或其他enum类型:用于避免函数重载头痛等隐式转换陷阱是有用的。



Answer 3:

Personnally我已经在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};
...

也有很多深入的答案在这太问题 。



Answer 4:

起初,我被你的问题感到困惑,但我想你想知道在C ++ 11的C ++枚举和那之间的区别。 作为最好的,我可以理解,在以后,你强类型的枚举,让您的范围他们。 我觉得这个解释很清楚。 干杯



文章来源: What's an enum class and why should I care?