C++ 的枚举 enum

C++ 的枚举 enum,用来在有限的范围定义明确命名的常量,通常值是整数类型。每个枚举项都与一个底层类型常量值对应,如果未指明,第一项为 0,其他项均为前一项 +1。

enum Color {
	blue, // 0
	green, // 1
	red = 6,
	gray, // 7
};

有两种风格的枚举型别,C++98 风格的枚举型别和 C++11 风格的型别,两者有很大区别,通常来说后者更有优势。
C++98:

enum Color {
}

C++11:

enum class Color {
}
  • 前者的枚举量的访问范围不只在枚举型别中,包含该枚举类型的地方都被包括,被称为不限范围的枚举型别;后者加了 class,是限定范围的枚举型别,也被称为枚举类。
  • 不限范围枚举型别的枚举量会隐式转换到整数型别,从而可以转换到浮点型别。限定范围的枚举型别则不会隐式转换,如果需要采用强制转换的方式。
  • 两者在 C++11 中都可以进行前置声明,但是前者需要编译器选择一个整数型别作为其底层型别,通常会为枚举型别采用足够表示枚举量值的最小底层型别(有时编译器会用空间换时间,这意味着可能不会采用足够表示的最小底层类型)。限定作用域的枚举型别的底层型别是已知的,而不限定作用域的枚举型别是供指定的。
  • 底层型别的指定可以在枚举型别声明和定义中指定,限定作用域的底层型别默认是 int
#include <iostream>
 
using namespace std;

enum class Color;
//  {
// 	blue,
// 	green,
// 	red = 6,
// 	gray,
// };

int main(int argc, char* argv[]) {
	 bool is_int_type = std::is_same<int, 
	 	typename std::underlying_type<Color>::type>::value;
	if (is_int_type) {
		std::cout << "int type\n";
	}
	return 0;
}

不管限定作用域与否,都可以使用“:”指定方式指定底层型别:

enum class Color: long long;
  • 当引用 C++11 中的 std::tuple 型别的各个作用域时,前者比较适用。
    对于单纯的 tuple 在外部不便得知每一项的信息,
#include <iostream>
#include <tuple>

using namespace std;

// enum class Color {
// 	blue,
// 	green,
// 	red = 6,
// 	gray,
// };

int main(int argc, char* argv[]) {
	using Color = std::tuple<char, int, double>;
	Color color{'a', 6, 2.33f};
	auto b = std::get<2>(color);
	std::cout << b << "\n";
	return 0;
}

而采用不限范围的枚举型别则比较适合

#include <iostream>
#include <tuple>

using namespace std;

enum ColorInfo {
	b,
	g,
	r,
};

int main(int argc, char* argv[]) {
	using Color = std::tuple<char, int, double>;
	Color color{'a', 6, 2.33f};
	auto b = std::get<r>(color);
	std::cout << b << "\n";
	return 0;
}

参考:
Effective Modern C++ 简体中文版

C++中的枚举类型enum)是一种用户定义的数据类型,它用于定义一组命名的整数常量。枚举类型的语法如下: ```c++ enum 枚举类型名 { 枚举1, 枚举2, ... }; ``` 其中,枚举可以是任何整数常量,如果没有显式地为枚举指定,则第一个枚举默认为0,后续枚举依次加1。例如: ```c++ enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; ``` 上述代码定义了一个Weekday枚举类型,其中Monday的为0,Tuesday的为1,以此类推。 可以通过以下方式定义枚举: ```c++ enum Weekday { Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4, Friday = 5, Saturday = 6, Sunday = 7 }; ``` 上述代码定义了一个Weekday枚举类型,与之前的定义不同的是,这里显式地为每个枚举指定了枚举类型可以用于定义变量、函数参数、函数返回等,例如: ```c++ enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; Weekday today = Monday; void printWeekday(Weekday day) { switch (day) { case Monday: cout << "Monday" << endl; break; case Tuesday: cout << "Tuesday" << endl; break; case Wednesday: cout << "Wednesday" << endl; break; case Thursday: cout << "Thursday" << endl; break; case Friday: cout << "Friday" << endl; break; case Saturday: cout << "Saturday" << endl; break; case Sunday: cout << "Sunday" << endl; break; } } Weekday getNextDay(Weekday day) { return static_cast<Weekday>((day + 1) % 7); } ``` 上述代码定义了一个Weekday枚举类型以及一些与之相关的变量和函数。注意,在printWeekday函数中,我们使用了switch语句来根据传入的Weekday枚举进行不同的操作。在getNextDay函数中,我们使用了static_cast将整数常量转换为Weekday类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值