C++ 什么';这是一个枚举类,我为什么要关心它?
对于一个从来没有写过一行C++11,并且目前没有机会用C++11编程的人,你能在一小段话中告诉我:C++ 什么';这是一个枚举类,我为什么要关心它?,c++,c++11,enums,enum-class,C++,C++11,Enums,Enum Class,对于一个从来没有写过一行C++11,并且目前没有机会用C++11编程的人,你能在一小段话中告诉我: 什么是“EnUM类”,为什么我们需要它? 起初我被你的问题弄糊涂了,但是我想你想知道C++ C++和C++ 11之间的区别。正如我所能理解的那样,在后面的部分中,您使用了强类型枚举,它允许您对它们进行范围限定。我认为这很好地解释了这一点。干杯 当数据大小很重要时,可以显式指定存储类型(可能将其打包到结构中) 枚举值的范围仅限于枚举的名称;在c++11之前,它们泄漏到了封闭的作用域中 我似乎记得转换
什么是“EnUM类”,为什么我们需要它?
起初我被你的问题弄糊涂了,但是我想你想知道C++ C++和C++ 11之间的区别。正如我所能理解的那样,在后面的部分中,您使用了强类型枚举,它允许您对它们进行范围限定。我认为这很好地解释了这一点。干杯
enum
s的存储大小在C++11之前会发生变化,这取决于分配给枚举的最大值。通常情况下,这没什么大不了的,但当它发生的时候,你不得不求助于丑陋的黑客来迫使你改变尺寸
关于第3点,在C++11中,
enum
s不能隐式转换或与int
s或其他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++03中,通过将enum
放在专用的类中,可以有效地完成同样的事情。也许这就是语法的来源,这有点让人困惑
另一个区别是,这种类型的枚举数不会隐式转换为int
(static\u cast
是必需的)。这可能很少需要,但它可以安全地重载使用int
参数的函数和使用enum
类型的函数。您可以确保不会意外调用int
。或者,您可以使用专用的运算符函数定义伪整数类型,并确保内置运算符不会干扰
这两个不相关的差异出现在同一个包中,并且您无法获得没有隐式转换的无范围枚举,这有点令人恼火,但通常这两个更改都是好事,enum类
在C++11中是一个很好的默认实践
编辑:作用域枚举的定义如下:
enum class duck { huey, dewey, louie };
duck culprit = duck::huey; // or "auto culprit" to avoid redundancy
并且必须与作用域解析运算符:
一起使用,如下所示:
enum class duck { huey, dewey, louie };
duck culprit = duck::huey; // or "auto culprit" to avoid redundancy
请注意,:
运算符也适用于C++03非作用域枚举,因此,即使第一行缺少类,上面的第二行也可以工作
这可能是过多的细节,但是如果向前声明枚举类型,则class
不会进入详细的类型说明符,如中所示
void quack( enum duck whom ); // not "enum class"
然而,在C++11中有一个新的构造,不透明枚举声明,它确实包含类
关键字并定义了一个完整的类型
enum duck; // duck is declared as incomplete type
enum class duck; // duck is now complete type; underlying type defaults to int
关键字struct
可以代替class
,没有语义上的区别。@user:我认为这不能回答我的两个问题。这绝对是一个不同的问题。其他问题(有各种各样的问题)询问特定的细节或与类似C++03构造的关系。这是一个范围更广的问题,也是一个很好的常见问题;另一个答案中没有的答案是“阅读你的C++11书籍”——没有进行任何研究。我会投反对票重新开放。哦,如果这成为一个问题,我可能会投反对票。因为这是标签工作的疯狂方式,宝贝。很多限制不是你所谓的“自由”Abyx,也许你有道理。我的措辞有点不准确,但我认为这更符合现实。对于快乐的选民,您可能需要查看参考资料。我认为这是一个非常有用的链接。它如何回答什么是enum
类?它回答了您的问题,我们为什么需要它?。这就是我需要它的原因和我使用它的方式。类
与指定无符号字符
无关,并且您不应该通过传输结构的字节来序列化,尤其是通过TCP(尽管如果所有字段都是一个字节,这确实避免了endianness问题)。我使用了1的对齐方式。我认为,如果两个平台都有相同的操作系统,这就是相同的endianness,就像我工作的系统一样。最佳实践:不要假设endianness。有一个RFC指定big-endian(与Intel相反)是internet二进制传输的官方endian,因此它用于TCP数据包头等等。你可能会在维基百科的页面上找到关于endianness的RFC链接。经过鲁本的编辑,这真的很有希望。现在,如果你能就#3给出一个明确的声明,详细阐述你的所有观点,而不仅仅是#1,我会很想投赞成票:)
枚举类
与使用:
@Potatoswatter right指定基础类型无关,但在不使用枚举类
的情况下指定基础类型仅作为转换语法AFAIK提供。@sbi至于3,在C++11中,enum
s不能隐式转换或与int
s或其他enum
类型进行比较。转换到什么?附录D(标准中关于向后兼容性特性的部分)没有提到任何关于枚举的内容