首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >枚举与强类型枚举

枚举与强类型枚举
EN

Stack Overflow用户
提问于 2012-09-25 18:29:06
回答 5查看 62.2K关注 0票数 84

我是C++编程的初学者。

今天我遇到了一个新话题:强类型enum。我研究了一下,但到目前为止,我还不明白为什么我们需要这个,它有什么用?

例如,如果我们有:

代码语言:javascript
运行
复制
enum xyz{a, b, c};
/*a = 0, b = 1, c = 2, (Typical C format)*/

为什么我们需要这样写:

代码语言:javascript
运行
复制
enum class xyz{a, b, c};

我们在这里想要做什么?我最重要的疑问是如何使用它。你能提供一个小例子,让我明白吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-09-25 18:34:47

好的,第一个例子:旧式枚举没有自己的作用域:

代码语言:javascript
运行
复制
enum Animals {Bear, Cat, Chicken};
enum Birds {Eagle, Duck, Chicken}; // error! Chicken has already been declared!

enum class Fruits { Apple, Pear, Orange };
enum class Colours { Blue, White, Orange }; // no problem!

其次,它们隐式地转换为整型类型,这可能导致奇怪的行为:

代码语言:javascript
运行
复制
bool b = Bear && Duck; // what?

最后,您可以指定C++11枚举的底层整数类型:

代码语言:javascript
运行
复制
enum class Foo : char { A, B, C};

以前,没有指定底层类型,这可能会导致平台之间的兼容性问题。编辑在注释中指出,您还可以在C++11中指定“旧样式”枚举的底层整数类型。

票数 116
EN

Stack Overflow用户

发布于 2012-09-25 18:35:05

this IBM page上有一篇关于枚举的好文章,它非常详细,写得也很好。以下是一些重要的要点:

作用域枚举解决了常规枚举带来的大多数限制:完整的类型安全、定义良好的底层类型、作用域问题和转发声明。

  • 您可以通过禁止范围枚举到其他类型的所有隐式转换来实现类型安全。
  • 您将获得一个新的范围,该枚举将不再位于封闭范围内,从而避免了名称冲突。
  • 作用域枚举使您能够指定枚举的底层类型,对于作用域枚举,如果您选择不指定它,则默认为int。
  • 任何具有固定基础类型的枚举都可以向前声明。
票数 17
EN

Stack Overflow用户

发布于 2012-09-25 18:33:38

enum class的值实际上是enum class类型,而不是C枚举的underlying_type类型。

代码语言:javascript
运行
复制
enum xyz { a, b, c};
enum class xyz_c { d, f, e };

void f(xyz x)
{
}

void f_c(xyz_c x)
{
}

// OK.
f(0);
// OK for C++03 and C++11.
f(a);
// OK with C++11.
f(xyz::a);
// ERROR.
f_c(0);
// OK.
f_c(xyz_c::d);
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12581064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档