C++ 枚举

2025 年 8 月 29 日 | 阅读 8 分钟

在 C++ 中,枚举(Enum)是一种用户自定义数据类型,它包含一组固定的命名整数常量。我们可以使用 enum 关键字来定义枚举。它有助于使代码更具可读性和可维护性。

C++ Enumeration

它可以用于表示星期(Sun、Mon、Tue、Wed、Thu、Fri 和 Sat)、月份(Jan、Feb、Mar、Apr、May、June、July、Aug、Sep、Oct、Nov、Dec)、方向(NORTH、SOUTH、EAST 和 WEST)等。C++ 枚举常量是隐式静态和最终的。

语法

它具有以下语法:

在这个语法中,

  • enum:用于声明枚举类型。
  • enum_name:表示枚举的名称。
  • val1, val2, val3…:表示整数常量。

C++ 枚举示例

让我们通过一个例子来说明 C++ 中的枚举。

示例

编译并运行

输出

Month: 3

说明

在这个例子中,我们声明了一个名为 month 的枚举,其中包含 mon_name。之后,将 mon_name 变量赋值为 Mar。当打印 mon_name + 1 时,它显示 3,因为枚举值默认从 0 开始分配。因此,Mar 是 2,2 + 1 是 3。mon_name + 1 的输出是 3,即 March。

初始化枚举

C++ 中,枚举类型的变量必须通过为枚举类型变量赋值来初始化。我们可以通过赋值(=)运算符来初始化枚举变量,后面跟着一个枚举常量。

C++ 初始化枚举示例

让我们通过一个例子来说明如何在 C++ 中初始化枚举。

示例

编译并运行

输出

My colour value: 2

说明

在这个例子中,我们创建了一个名为 Color 的枚举,其成员为 RED、GREEN 和 BLUE,每个成员都被自动赋予整数值 0、1 和 2。在 main() 函数中,创建了一个名为 myColor 的变量并用 BLUE 初始化,然后将 myColor 的底层整数值(2)打印到控制台。

更改命名常量的数值

在 C++ 中,enum 定义了一个用户定义的数据类型,其中包含命名的整数常量。如果我们需要更改命名常量的数值,我们可以手动为枚举成员赋值。

语法

它具有以下语法:

在这个语法中,

  • enum_name:表示枚举的名称。
  • name1, name2, name3:表示命名常量。
  • 如果未显式赋值,它将从前一个值递增。

C++ 更改命名常量数值

让我们通过一个例子来说明如何在 C++ 中更改命名常量的数值。

示例

编译并运行

输出

Priority level: 30

说明

在这个例子中,Priority 枚举中的命名常量被显式设置为 10、20、30 和 40。它们在运行时不会被更改,因为它们是最终值,但它们与原始的基于 0 的枚举值不同。

枚举的类型

枚举主要可分为两类:作用域枚举和无作用域枚举。

C++ Enumeration

现在,我们将一一讨论这些枚举。

1) 无作用域枚举

在 C++ 中,无作用域枚举是枚举的基本类型。我们可以使用 enum 关键字定义无作用域枚举,其枚举器名称在封闭作用域内声明。

无作用域枚举会自动分配从 0 开始的整数值,除非另有规定。枚举器名称可以隐式转换为整数,这使得与算术和比较运算符的无缝集成成为可能。如果我们想在作用域内将枚举器与变量赋予相同的名称,可能会导致错误。

C++ 无作用域枚举示例

让我们通过一个例子来说明 C++ 中的无作用域枚举。

示例

编译并运行

输出

Numeric value of today: 3
It is a mid-day of the Week

说明

在此示例中,我们使用了无作用域枚举 Day 来表示一周中的天数,其隐式整数值从 0 开始。之后,将 Wed 赋值给变量 today,打印其数值,并检查它是否为星期三以显示消息。

2) 作用域枚举

作用域枚举(Enum Class)可以使用 enum class 关键字定义。作用域枚举在 C++11 中引入。这些枚举提供了更好的类型安全性并避免了名称冲突。它不会隐式转换为整数,并且需要作用域解析(::)运算符来访问枚举值。

C++ 作用域枚举示例

让我们通过一个例子来说明 C++ 中的作用域枚举。

示例

编译并运行

输出

The color is Yellow
Integer value of color: 1

说明

在此示例中,我们定义了一个名为 Color 的枚举类,其中包含三个颜色常量。之后,将变量 c 赋值为作用域枚举器 Color::Yellow,并检查其值。由于枚举类不允许隐式转换为 int,因此它使用 static_cast<int>(c) 来打印枚举常量的底层整数值。

枚举作为函数参数

在 C++ 中,我们可以将枚举用作函数参数。如果我们想将枚举作为函数参数传递,我们必须与其实例一起定义枚举名称。

C++ 枚举作为参数传递示例

让我们通过一个例子来说明如何在 C++ 中将枚举作为参数传递。

示例

编译并运行

输出

Result: 25

说明

在此示例中,我们使用了一个 Operation 枚举,并将其作为参数传递给 calculate 函数,以选择加法或减法。之后,它使用 Add 函数调用该函数并显示返回的值 25。

C++ 枚举注意事项

  • 枚举提高了类型安全性。
  • 枚举可以轻松地在 switch 语句中使用。
  • 枚举可以被遍历。
  • 枚举不能有字段、构造函数和方法。
  • 枚举可以实现许多接口,但不能继承任何类,因为它内部继承了 Enum 类。

枚举的优点

C++ 中枚举的几个优点如下:

  • 枚举为值提供了更好的名称,使代码更具可读性,易于理解和维护。
  • C++ 中的枚举限制了分配的值,特别是作用域枚举,它们出错的可能性较小,并消除了名称冲突。
  • 枚举通过收集相关的常量来帮助代码结构化,从而提高代码的可读性,确保类型安全,使函数接口更清晰,并允许更方便地重构。
  • 枚举与 switch 语句配合良好,并允许直接控制具有分配值的底层类型。

枚举的局限性

C++ 中枚举的几个局限性如下:

  • 无作用域枚举可能导致名称冲突和隐式转换为整数,这会使代码更容易出错。
  • 枚举具有有限的值集,并且没有成员函数,因此无法在运行时扩展。
  • 枚举值可以在调试器中显示为整数,这使得区分其含义更加困难。

结论

总之,C++ 枚举使我们能够声明命名常量列表,它使我们的代码类型安全且易于阅读。枚举可以用特定值初始化,传递给函数,并通过作用域枚举(enum class)进行增强以提高类型安全性。它们提供了可读性更好和代码结构化的好处,但局限性包括名称冲突的可能性和某些情况下功能受限。

C++ 枚举选择题

1) 第一个枚举常量的默认起始值是多少?

  1. 1
  2. 0
  3. 未定义
  4. 1
 

答案:B) 0


2) 以下关于 C++ 中的 enum class 的哪个操作是正确的?

  1. 它允许隐式类型转换为整数。
  2. 它可能与其他枚举发生名称冲突。
  3. 它强制执行类型安全并防止名称冲突。
  4. 它没有作用域,允许直接访问值。
 

答案:C) 它强制执行类型安全并防止名称冲突。


3) 当我们将 1 添加到 C++ 中的枚举常量时会发生什么?

  1. 它的值增加 1。
  2. 会报错,因为枚举不能被修改。
  3. 它会改变常量的类型。
  4. 如果枚举是连续的,它将得到下一个枚举值。
 

答案:D) 如果枚举是连续的,它将得到下一个枚举值。


4) 以下哪个选项不是使用 C++ 枚举的优点?

  1. 提高可读性
  2. 类型安全
  3. 与其他变量发生名称冲突
  4. 与 switch 语句的改进功能
 

答案:C) 与其他变量发生名称冲突


5) 如何在 C++ 中手动设置枚举的值?

  1. 使用 enum class 关键字。
  2. 在声明时分配特定值。
  3. 使用指针。
  4. 在 main 函数中初始化枚举。
 

答案:B) 在声明时分配特定值。


下一主题C++ 数学函数