无法理解C++中的枚举,它们实际上是什么?
Can't understand enums in C++, what are they actually ?
过去几年我用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
(或b
或c
)作为类名或其他任何东西,它似乎写:
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 };
a
、c
和d
是全局名称。
对此的经典解决方案是在值前面加上标识符,例如枚举的名称:
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# 我知道你觉得这是最接近"感觉"的东西,因为枚举本身就是全局变量的集合
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 声明是否无效()合法,它实际上是什么?
- 实际上,什么是负数的模
- C 如果实际上是继承了类,则内部发生了什么
- 无法理解C++中的枚举,它们实际上是什么?
- new (nothrow)操作符实际上是什么意思,为什么要使用它