- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于从未写过一行 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/
我是一名优秀的程序员,十分优秀!