C++ enum 和 enum class
在C++中, enum
是一种定义枚举类型的方法。 一个枚举是一个整数值的命名集合。 可以通过以下方式创建一个枚举类型:
enum Color {
RED,
GREEN,
BLUE
};
这里我们定义了一个名为 Color
的枚举类型,并包括三个命名值: RED
, GREEN
和 BLUE
。 在默认情况下,第一个名称的值是0,后续名称的值将递增。
我们可以使用此枚举类型来定义变量:
Color myColor = RED;
我们也可以直接访问枚举中的某个值(注意:这不是枚举的类型):
int value = GREEN;
在 enum
中,虽然命名值在同一个命名空间(namespace)中,但它们的作用域是全局的。
另一方面,enum class
是C++11引入的新特性。与传统的枚举类型相比,enum class
具有更严格的类型检查和更高的安全性。 在 enum class
中,命名值不再具有全局作用域。 这是 enum
和 enum class
的一个主要区别。
我们可以使用以下方式创建一个 enum class
:
enum class Color2 {
RED,
GREEN,
BLUE
};
这里我们定义了一个名为 Color2
的 enum class
,并包括三个命名值: RED
, GREEN
, 和 BLUE
。 请注意,在 enum class
中,命名值是在类型范围内定义的。 因此,我们将命名值作为 Color2::RED
等限定符使用。
我们可以使用下面的语句定义变量:
Color2 myColor2 = Color2::RED;
我们也可以直接访问枚举中的某个值:
int value = static_cast<int>(Color2::GREEN);
在 enum class
中,命名值的作用域仅限于该 enum class
。 这意味着我们不能在不使用限定符的情况下直接引用命名值。
共同点
enum
和enum class
都是定义枚举类型的方法。
区别
- 在默认情况下,
enum
是基于int类型的;而enum class
明确指定了底层类型(默认为int)。 - 在
enum
中,命名值在全局范围内具有作用域。 但在enum class
中,命名值的作用域限制在enum class
内部。 enum
命名值之间可以进行赋值、比较等操作,而在enum class
中,只有类型相同的枚举值才能进行此类操作。enum
与普通的整型值之间可以交换转换,但是很容易出现类型不匹配等问题。 而在将enum class
值与整数值进行比较之前,需要先进行强制类型转换。