C++语言导学 第二章 用户自定义类型 - 2.5 枚举

本文介绍了C++中的枚举类型,包括enumclass的用法,强调了强类型枚举的特性,如作用域限制和防止类型混淆。枚举类型用于表示有限的整数值集合,提高了代码可读性和安全性。枚举值默认从0开始,可以通过运算符重载扩展其功能。同时,对比了enumclass与传统枚举的区别,后者允许隐式类型转换,可能导致潜在错误。
摘要由CSDN通过智能技术生成

C++语言导学 第二章 用户自定义类型 - 2.5 枚举

2.5 枚举

除了类之外,C++还提供了一种形式简单的用户自定义类型,可以用来枚举一系列值:

enum class Color{red, blue, green};
enum class Traffic_light{green, yellow, red};
Color col = Color::red;
Traffic_light light = Traffic_light::red;

注意,枚举值(如red)位于其enum class的作用域之内,因此我们可以在不同的enum class中重复使用这些枚举值而不致引起混淆。例如,Color::red是指Color的red,它与Traffic_light::red显然不同。

枚举类型常用于描述规模较小的整数值集合。通过使用有指代意义的(且易于记忆的)枚举值名字,可以提高代码的可读性,降低出错的风险。

enum后面的class关键字指明了枚举是强类型的,且它的枚举值位于指定的作用域中。不同的enum class是不同的类型,这有助于防止对常量的意外误用。例如,我们不能混用Traffic_light和Color的值:

Color x = red;					//错误:哪个red?
Color y = Traffic_light::red;	//错误:这个red不是一个Color
Color z = Color::red;			//正确

同样,我们也不能隐式地混用Color和整数值:

int i = Color::red;			//错误:Color::red不是一个int
Color c = 2;				//初始化错误:2不是一个Color

捕捉试图向枚举类型的转换是避免错误的一种好的防御措施,但我们常常希望用枚举类型的基础类型(默认是int)的值对其初始化,这就是允许从基础类型隐式转换为枚举类型:

Color x = Color{5};		//正确,但有些啰嗦
Color y{6};				//也是正确的

默认情况下,enum class只定义了赋值、初始化和比较(如==和<)操作。然而,既然枚举类型是一种用户自定义类型,那么就可以为它定义别的运算符:

Traffic_light& operator++(Traffic_light& t)	//前置递增运算符++
{
	switch(t){
	case Traffic_light::green: return t = Traffic_light::yellow;
	case Traffic_light::yellow: return t = Traffic_light::red;
	case Traffic_light::red: return t = Traffic_light::green;
	}
}
Traffic_light next = ++light;	//next变成了Traffic_light::green

如果你不想显式地限定枚举值名字,并且希望枚举值可以是int(无须显式转换),你可以去掉enum class中的class而得到一个“普通”enum。“普通”enum中的枚举值的作用域与其enum的作用域一致,并且会隐式地转换成整数值。例如:

enum Color{red, green, blue};
int col = green;

在这里,col的值是1.默认情况下,枚举值对应的整数从0开始,依次加1。“普通”enum很早就出现在C++和C中了,所以即使它的效果并不是那么好,在当前的代码中仍很常见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hank_W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值