C++ 枚举类型

C++ 枚举类型

在C++中,枚举(enum)是一种用户定义的类型,用于表示一组命名的常量。C++11引入了强类型枚举(enum class),提供了更强的类型安全性和作用域控制。以下是对传统枚举(enum)和强类型枚举(enum class)的详细总结。

1. 传统枚举(enum)

传统枚举是C++中最早引入的一种枚举类型,定义在全局作用域或类作用域中。传统枚举的枚举值是整型常量,可以隐式转换为整数类型。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>

enum Color {
Red,
Green,
Blue
};

int main() {
Color color = Red;
std::cout << "Color: " << color << std::endl; // 输出:Color: 0

// 隐式转换为整数
int colorValue = color;
std::cout << "Color value: " << colorValue << std::endl; // 输出:Color value: 0

return 0;
}

特点

  • 隐式转换:枚举值可以隐式转换为整数类型。
  • 作用域:枚举值在定义的作用域内是全局的,可能会导致命名冲突。
  • 类型安全性:较低,枚举值可以隐式转换为整数,容易引发错误。

2. 强类型枚举(enum class)

C++11引入了强类型枚举(enum class),提供了更强的类型安全性和作用域控制。强类型枚举的枚举值不能隐式转换为整数类型,必须显式转换。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>

enum class Color {
Red,
Green,
Blue
};

int main() {
Color color = Color::Red;
// std::cout << "Color: " << color << std::endl; // 错误:不能隐式转换为整数

// 显式转换为整数
int colorValue = static_cast<int>(color);
std::cout << "Color value: " << colorValue << std::endl; // 输出:Color value: 0

return 0;
}

特点

  • 显式转换:枚举值不能隐式转换为整数类型,必须显式转换。
  • 作用域:枚举值在定义的作用域内是局部的,避免了命名冲突。
  • 类型安全性:更高,枚举值不能隐式转换为整数,减少了错误的可能性。

3. 枚举的定义和使用

传统枚举的定义和使用

1
2
3
4
5
6
7
enum Color {
Red,
Green,
Blue
};

Color color = Red;

强类型枚举的定义和使用

1
2
3
4
5
6
7
enum class Color {
Red,
Green,
Blue
};

Color color = Color::Red;

4. 枚举的底层类型

在C++11及其后续版本中,可以指定枚举的底层类型。默认情况下,底层类型是 int

示例:指定底层类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

enum class Color : unsigned int {
Red,
Green,
Blue
};

int main() {
Color color = Color::Red;
unsigned int colorValue = static_cast<unsigned int>(color);
std::cout << "Color value: " << colorValue << std::endl; // 输出:Color value: 0

return 0;
}

5. 枚举的比较

枚举值可以进行比较操作,如相等性比较和关系比较。

示例:枚举的比较

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>

enum class Color {
Red,
Green,
Blue
};

int main() {
Color color1 = Color::Red;
Color color2 = Color::Green;

if (color1 == Color::Red) {
std::cout << "color1 is Red" << std::endl;
}

if (color1 != color2) {
std::cout << "color1 is not equal to color2" << std::endl;
}

return 0;
}

总结

  • 传统枚举(enum)

    • 隐式转换:枚举值可以隐式转换为整数类型。
    • 作用域:枚举值在定义的作用域内是全局的,可能会导致命名冲突。
    • 类型安全性:较低,枚举值可以隐式转换为整数,容易引发错误。
  • 强类型枚举(enum class)

    • 显式转换:枚举值不能隐式转换为整数类型,必须显式转换。
    • 作用域:枚举值在定义的作用域内是局部的,避免了命名冲突。
    • 类型安全性:更高,枚举值不能隐式转换为整数,减少了错误的可能性。
    • 底层类型:可以指定枚举的底层类型。

C++ 枚举类型
https://linhanmic.github.io/2024/09/13/C++ 枚举/
作者
Linhanmic
发布于
2024年9月13日
更新于
2024年9月13日
许可协议