C++ 什么';这是一个枚举类,我为什么要关心它?

C++ 什么';这是一个枚举类,我为什么要关心它?,c++,c++11,enums,enum-class,C++,C++11,Enums,Enum Class,对于一个从来没有写过一行C++11,并且目前没有机会用C++11编程的人,你能在一小段话中告诉我: 什么是“EnUM类”,为什么我们需要它? 起初我被你的问题弄糊涂了,但是我想你想知道C++ C++和C++ 11之间的区别。正如我所能理解的那样,在后面的部分中,您使用了强类型枚举,它允许您对它们进行范围限定。我认为这很好地解释了这一点。干杯 当数据大小很重要时,可以显式指定存储类型(可能将其打包到结构中) 枚举值的范围仅限于枚举的名称;在c++11之前,它们泄漏到了封闭的作用域中 我似乎记得转换

对于一个从来没有写过一行C++11,并且目前没有机会用C++11编程的人,你能在一小段话中告诉我:


什么是“EnUM类”,为什么我们需要它?

起初我被你的问题弄糊涂了,但是我想你想知道C++ C++和C++ 11之间的区别。正如我所能理解的那样,在后面的部分中,您使用了强类型枚举,它允许您对它们进行范围限定。我认为这很好地解释了这一点。干杯

  • 当数据大小很重要时,可以显式指定存储类型(可能将其打包到结构中)
  • 枚举值的范围仅限于枚举的名称;在c++11之前,它们泄漏到了封闭的作用域中
  • 我似乎记得转换规则也有所改变
  • 与第1点1相关,
    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(标准中关于向后兼容性特性的部分)没有提到任何关于枚举的内容