枚举类型 | enum

枚举器 enumerator:就是枚举定义中的符号常量/命名常量/枚举常量

enum

enum是一个自定义数据类型,用以保存整型常量,并且可以通过名字引用这些常量
默认情况下,enum中定义的值的类型是signed int,这意味着枚举量可以是负数
枚举类型主要提供了两个语义:

  • 提供了整型符号常量(判断时可读性更好)
  • 提供了一个枚举类型(可以定义枚举变量)

定义枚举

使用enum关键字即可定义枚举
枚举可以是

  1. 匿名的
  2. 具名的
enum{		//	该枚举类型没有名字,为匿名枚举
	Up,
	Down,
	Left,
	Right
};

enum Direction{	//	具名枚举
	Up,
	...
};

枚举定义中的标识符,可以作为整型符号常量进行使用(一般配合switch语句使用)

不论是枚举类型名,还是定义中的符号常量;都不允许在当前作用域中存在标识符冲突
例如下一小节中,同时定义两个枚举,会出现标识符冲突

枚举变量

定义枚举变量的方式有两种

  1. 定义枚举时声明
  2. 定义之后声明

匿名枚举只能通过第一种方式声明变量

enum{
	Red,
	Blue,
	Green
}color1;			//	在枚举定义结尾声明

enum Color{
	Red,
	Blue,
	Green
};

enum Color color2;		//	使用枚举类型声明

C语言中声明枚举变量,也需要加enum关键字

尽管枚举变量被认为是枚举类型,但是它们仍然存在以下特性

  1. 可以给它们赋整型值(包括其他枚举中的值(符号常量)
  2. 可以赋给整型值的变量,也可以把枚举变量赋给它们

就是说尽管是枚举类型,在赋值时,C语言并不区分枚举类型与整型

下面的语句都是合法的

//	@file main.c
enum {Bicycle, Motorbike, Car};
color1 = Car;
color1 = 200;
int a = 10;
color1 = a;
a = color1;

在C语言中是合法的,但C++无法完成转换

C++中的枚举

为了解决枚举中符号常量可能存在的命名冲突问题
C++引入了命名空间,部分解决了这个问题
C++11还引入了强类型(或范围)枚举enum class

//	无范围枚举
enum [identifier] [:type] {enum-list};

//	范围枚举
enum [class|struct] [identifier] [:type] {enum-list};

可以看到C++中支持指定枚举的类型[:type],可以是任何整型

class关键字,用以表示该枚举区分范围,并且必须提供枚举类型名(identifier)

符号常量范围

在原始的C/C++enum类型中,符号常量在声明enum的整个范围中可用
在区分范围的枚举中,符号常量必须由enum的类型名进行限定

也就是说,需要在枚举类型上使用作用域运算符,才可访问

enum class Test{
	a,
	b
};

Test::a

可以看到,如果不使用作用域运算符,符号常量Red会被识别为未定义标识符

color1 = Color::Red;			//	合法

image

## 类型转换 在C++中,枚举和整型之间的转换与C语言有所不同 - 普通枚举 - 枚举常量可以隐式转换为`int` - `int`不能隐式转换为枚举类型 - 不同枚举类型之间不能隐式转换 - 范围枚举 - 枚举常量不可隐式转换为`int`

要将int转换为枚举类型时,需要强制转换

static_cast<int>(enumerator);

下面是一些类型转换的例子
无范围枚举:

color1 = static_cast<Color>(a);		//	合法

image

范围枚举: 可以看到,在范围枚举中,枚举量无法隐式转换为int ``` stati_cast(color1); // 合法 ```

image

参考文档
GNU C Reference Manual
Microsoft Learn
cppreference.com

posted @ 2024-04-28 17:30  lifeAddicted  阅读(137)  评论(0)    收藏  举报