无法理解C++中的枚举,它们实际上是什么?

Can't understand enums in C++, what are they actually ?

本文关键字:实际上 是什么 枚举 C++      更新时间:2023-10-16

过去几年我用C#编程,现在我又回到了C++。在 C# 中,枚举的行为如下所示:

enum myenum { a,b,c} 
myenum myinstance = myenum.a;

所以我可以做这样的事情:

enum myenum { a,b,c}     
enum myenum2 { a,b,c} 
myenum myinstance = myenum.a;

一切都会好起来的。

C++它不会编译,而且我现在不能使用 a(或bc)作为类名或其他任何东西,它似乎写:

enum myenum { a, b };

与声明全局 int 变量相同:

int a =0, b=1;

我不明白为什么C++的开发人员为枚举选择这种类型的行为,枚举是什么? 它是一种类型吗? 或者只是编译器用一些 int 声明替换的东西?

如果您有权访问 C++11 编译器,请改用 enum class s。这些也称为强类型枚举。

enum class myenum { a,b,c};     
enum class myenum2 { a,b,c}; 
myenum myinstance = myenum::a;

这具有您期望的行为。

但是请注意,它们不像经典C++ enum那样隐式转换为int

最后回答您的问题:C++枚举不同的类型,但不幸的是,它们可以隐式转换为 int ,并且正如您已经注意到的,它们没有自己的命名空间。这是该语言及其C遗产的历史文物。我在这里描述的强类型枚举都没有这些问题。

有关它们的更多信息和一些背景,请查看本文

C++枚举值是全局定义的,所以正如你所注意到的,如果你写一个这样的枚举:

enum my_enum { a , b , c };

acd是全局名称。

对此的经典解决方案是在值前面加上标识符,例如枚举的名称:

enum my_enum
{
    MY_ENUM_A , 
    MY_ENUM_B , 
    MY_ENUM_C
};

但是,C++11 添加了强类型枚举,该枚举以作用域形式定义其值:

enum class my_enum { a , b , c };
my_enum one = my_enum::a; //ok
my_enum two = a;          //This not compiles, because a is not defined in this scope.

您可能希望将枚举封装在命名空间中,以便执行此操作

namespace myenum2
{
enum myenum2_enum
{ a,b,c };
}
namespace myenum
{
enum myenum_enum
{ a,b,c };
}

然后你可以使用 myenum::a 或 myenum2::b,等等......来自 C# 我知道你觉得这是最接近"感觉"的东西,因为枚举本身就是全局变量的集合