- C++ 基础
- C++ 首页
- C++ 概述
- C++ 环境设置
- C++ 基本语法
- C++ 注释
- C++ Hello World
- C++ 省略命名空间
- C++ 常量/字面量
- C++ 关键字
- C++ 标识符
- C++ 数据类型
- C++ 数值数据类型
- C++ 字符数据类型
- C++ 布尔数据类型
- C++ 变量类型
- C++ 变量作用域
- C++ 多个变量
- C++ 基本输入/输出
- C++ 修饰符类型
- C++ 存储类
- C++ 运算符
- C++ 数字
- C++ 枚举
- C++ 引用
- C++ 日期和时间
- C++ 控制语句
- C++ 决策
- C++ if 语句
- C++ if else 语句
- C++ 嵌套 if 语句
- C++ switch 语句
- C++ 嵌套 switch 语句
- C++ 循环类型
- C++ while 循环
- C++ for 循环
- C++ do while 循环
- C++ foreach 循环
- C++ 嵌套循环
- C++ break 语句
- C++ continue 语句
- C++ goto 语句
- C++ 构造函数
- C++ 构造函数和析构函数
- C++ 复制构造函数
C++ - 枚举 (Enum)
在 C++ 中,枚举(或 enum)是一种用户定义的数据类型,它由一组命名的整型常量组成。
创建(声明)枚举类型
要创建枚举 (enum),请使用 **enum** 关键字,后跟枚举的名称和进一步用花括号括起来的名值列表。
语法
以下是创建枚举的语法:
enum enumName {
Enumerator_value1,
Enumerator_value2,
Enumerator_value3,
// … So on
};
这里,
- **enum** 是声明枚举类型的关键字。
- **enumName** 是枚举的名称。
- Enumerator_Value1、Enumerator_Value1、Enumerator_Value1 等是整型常量。
访问枚举
您可以通过在 int main() 函数体中用变量名声明它并在需要时调用它来访问枚举 (enum)。
语法
这是访问或调用枚举的语法
enum enumName {
Enumerator_value1,
Enumerator_value2,
Enumerator_value3,
// … So on
};
// Creating variable and assigning value
enumName enam_var = value;
这里,
- **enumName** 是枚举的已声明变量名。
- **variableName** 是枚举器(在枚举中定义的值)的变量名。
C++ 枚举示例
在下面的示例中,我们声明了一个枚举类型,声明了一个枚举的变量/对象,并访问了枚举常量。请考虑以下示例:
#include <iostream>
using namespace std;
// Define an enumeration called Day, for a days of week
enum Day {
Sunday, // 0
Monday, // 1
Tuesday, // 2
Wednesday, // 3
Thursday, // 4
Friday = 45, // 45
Saturday // 46
};
int main() {
// Declaring a variable for a day
Day get1 = Wednesday;
cout<<get1<<endl;
cout<<Saturday<<endl;
return 0;
}
输出
3 46
解释
在上面的代码中,默认情况下,每个星期的值都已显式地分配了一个唯一的整数值,范围从 0 到 6,分配给一周中的所有日子。但是,如果我们显式地将值 45 分配给星期五,则枚举属性将导致序列从该特定点继续,因此星期五和星期六的剩余值将分别变为 45 和 46,并在之后继续完成序列。
C++ 枚举的类型
C++ 中通常有两种类型的枚举:
1. 无作用域枚举
无作用域枚举是 C++ 中传统的枚举形式。它们使用 enum 关键字定义,枚举器名称在包含作用域中声明。由于枚举器名称被添加到周围的作用域,如果没有仔细管理,可能会导致名称冲突,它可以直接在代码中使用,就像一组表示特定数字的标签。
它会自动分配从零开始的整数值(除非显式分配),并且可以隐式转换为整数。
示例
#include <iostream>
using namespace std;
enum RGB {
Red, // 0
Green, // 1
Blue // 2
};
void printColor(RGB color) {
switch (color) {
case Red: cout << "Color is Red"; break;
case Green: cout << "Color is Green"; break;
case Blue: cout << "Color is Blue"; break;
}
}
int main() {
RGB myColor = Red; // Here, no need to specify enum name
int value = myColor; // Implicit conversion to int
cout << "Integer value: " << value << endl; // Outputs: 0
printColor(myColor); // Outputs: Color is Red
return 0;
}
输出
Integer value: 0 Color is Red
2. 有作用域枚举 (enum class)
有作用域枚举是在 C++11 中引入的,使用 enum class 定义。它们提供了更好的类型安全性和组织性,其中它们的枚举器名称在枚举中具有作用域。这意味着将它们的标签保存在特定组中,因此在使用它们时需要提及组名。这有助于避免在不同组中具有类似标签时造成混淆。
枚举器名称在枚举类型中具有作用域,这意味着您必须使用枚举名称来访问它们。没有隐式转换为整数,这有助于增强类型安全性。
示例
#include <iostream>
using namespace std;
enum class Color {
Red, // Implicitly 0
Green, // Implicitly 1
Blue // Implicitly 2
};
// Usage
int main() {
Color myColor = Color::Red; // Must use enum name
// int value = myColor; // Error: no implicit conversion
// Explicit conversion to int if needed
int value = static_cast<int>(myColor); // value = 0
cout << "Integer value: " << value << endl; // Outputs: 0
return 0;
}
输出
Integer value: 0
有作用域枚举与无作用域枚举
| 特性 | 无作用域枚举 | 有作用域枚举 (enum class) |
|---|---|---|
| 枚举器作用域 | 全局作用域 | 枚举类型内的作用域 |
| 名称冲突 | 可能 | 避免 |
| 隐式转换 | 是 | 否 |
| 类型安全 | 较少 | 更多 |
| 底层类型 | 默认为 int | 可以指定自定义类型 |
比较枚举值
枚举值可以像整数比较一样进行比较。请考虑以下示例:
示例
#include <iostream>
using namespace std;
enum class Color {
Red,
Green,
Blue
};
int main() {
Color myColor = Color::Green;
if (myColor == Color::Green) {
cout << "The color is green!" << endl;
} else {
cout << "The color is not green." << endl;
}
return 0;
}
输出
The color is green!
枚举作为函数参数
您可以将枚举作为参数传递给函数。要在函数中传递枚举作为参数,您需要指定枚举名称及其实例。
示例
在下面的示例中,我们将枚举作为参数传递:
#include <iostream>
using namespace std;
enum class Color {
Red,
Green,
Blue
};
// Function that takes an enum as a parameter
void printColor(Color color) {
switch (color) {
case Color::Red:
cout << "Red" << endl;
break;
case Color::Green:
cout << "Green" << endl;
break;
case Color::Blue:
cout << "Blue" << endl;
break;
}
}
int main() {
Color myColor = Color::Blue;
printColor(myColor);
return 0;
}
输出
Blue
枚举的常见用例
以下是枚举的一些常见用例:
1. 状态管理
enum class GameState {
MainMenu,
Playing,
Paused,
GameOver
};
2. 配置选项
enum class LogLevel {
Info,
Warning,
Error,
Debug
};
3. 命令类型
enum class Command {
Start,
Stop,
Pause,
Resume
};
4. 方向和移动
enum class Direction {
Up,
Down,
Left,
Right
};
使用枚举的好处
- **提高可读性和可维护性** - 枚举为值提供了有意义的名称,这使得代码更清晰、更易于理解和维护。
- **类型安全和命名空间管理** - C++ 中的枚举限制了分配的值,尤其是在有作用域的枚举中,这减少了错误并避免了名称冲突。
- **组织良好的代码结构** - 枚举有助于通过对相关常量进行分组来增强组织,从而提高代码可读性,强制执行类型安全性,创建更清晰的函数接口,并促进更轻松的重构
- **增强的功能** - 枚举与 switch 语句配合使用,并允许使用分配的值对底层类型进行显式控制。
枚举的局限性
尽管有好处,但它仍然有一些如下所述的局限性:
- **类型安全问题** - 无作用域枚举会导致名称冲突并允许隐式转换为整数,这会增加错误风险。
- **功能有限** - 枚举具有一组固定的值,并且缺乏成员函数,无法在运行时扩展。
- **调试困难** - 调试器可能会将枚举值显示为整数,这使得难以解释其含义。