gpt4 book ai didi

c++ - 什么是枚举类,我为什么要关心?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:33 28 4
gpt4 key购买 nike

对于从未写过一行 C++11,并且目前没有机会使用 C++11 进行编程的人,您能否在一个简短的段落中告诉我:

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

最佳答案

enum class 称为作用域枚举。它可以防止使用枚举器的名称污染枚举出现的 namespace 。

在 C++03 中,您可以通过将 enum 放在专用的 class 中来有效地做同样的事情。也许这就是语法的来源,这有点令人困惑。

另一个区别是这种类型的枚举数不会隐式转换为 int(需要 static_cast<int>)。这可能很少需要,但它可以安全地重载一个采用 int 参数的函数和一个采用 enum 类型的函数。您可以确定 int 不会被意外调用。或者您可以使用专用 operator 函数定义伪整数类型,并确保内置运算符不会干扰。

这两个不相关的差异出现在同一个包中,并且您无法获得没有隐式转换的 unscoped 枚举,这有点烦人,但通常这两个变化都是好事,而 enum class 是C++11 中的一个很好的默认做法。

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

enum class duck { huey, dewey, louie };

并且必须像这样与范围解析运算符 :: 一起使用:

duck culprit = duck::huey; // or "auto culprit" to avoid redundancy

请注意,:: 运算符也适用于 C++03 无作用域枚举,因此即使第一行缺少 class,上面的第二行也可以工作。

这可能过于详细,但是如果前向声明枚举类型,class 不会进入elaborated-type-specifier,如

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++ - 什么是枚举类,我为什么要关心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14041711/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com