对于一个从来没有谁写过一行C ++ 11,谁拥有,此刻,没有机会在编程C ++ 11,你可以在一个短款,告诉我:
一个什么是“枚举类”,我们为什么需要它?
对于一个从来没有谁写过一行C ++ 11,谁拥有,此刻,没有机会在编程C ++ 11,你可以在一个短款,告诉我:
一个什么是“枚举类”,我们为什么需要它?
enum class
被称为作用域枚举 。 它可以防止污染,其中枚举出现与统计员的名字命名空间。
在C ++ 03,你可以通过将有效地做同样的事情enum
专用的内部class
。 也许这就是语法,这是一个比较混乱的根源。
另一个区别在于,这种类型的枚举不隐式转换为int
( static_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
没有语义差异。
相对于指向一个1,的存储大小enum
s就根据分配给一个枚举最大值之前C ++ 11改变。 通常它不要紧这么多,但是当它你不得不求助于丑黑客给力的大小。
至于第3点,在C ++ 11 enum
s为不隐式转换或相当于int
S或其他enum
类型:用于避免函数重载头痛等隐式转换陷阱是有用的。
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};
...
也有很多深入的答案在这太问题 。
起初,我被你的问题感到困惑,但我想你想知道在C ++ 11的C ++枚举和那之间的区别。 作为最好的,我可以理解,在以后,你强类型的枚举,让您的范围他们。 我觉得这个解释很清楚。 干杯