在程序设计中,我们经常需要用到一组相关常量,这些常量表示一些有限的状态或取值范围。例如:星期、异常码。为了提高代码的可读性和可维护性,避免硬编码,引入枚举称为一种常见的数据类型。
C/C++中枚举定义
enum Color{
RED = 1, // 默认0开始,递增
YELLO,
BLUE
};
枚举经典做法
传统定义枚举的行为会有如下问题
- 作用域不受限,命名冲突。
- 会隐式转换为int
- 用来表征枚举变量的实际类型不能明确指明,从而无法支持枚举类型的前向声明。
C++的枚举类型的特性使得无法像类或结构体那样灵活地进行前向声明,因为它缺乏明确的类型信息。
#include <iostream>
using namespace std;
enum COLOR{ RED, BLUE };
enum WINE {RED, BAIJIU};
int main() {
WINE wine = RED; // 报错,编译器分不清RED是Color 还是 WINE
COLOR color = BLUE; // 正确
cout << wine << " " << color;
return 0;
}
一般来说,为了一致性,通常会在所有常量前加上前缀。C程序中不得不这样做,但在C++中的替代方法是命名空间
#include <iostream>
using namespace std;
namespace space1 {
enum COLOR { RED, BLUE };
};
namespace space2 {
enum WINE { RED, BAIJIU };
}
int main() {
space1::COLOR color = space1::RED;
space2::WINE wine = space2::RED;
cout << color << " " << wine << endl;
return 0;
}
更为有效的办法是使用一个类或结构体限定器作用域。
强类型枚举(enum class)
C++11的新语法,解决传统C++枚举类型的缺陷。解决了上述枚举常量暴漏在外层作用域中,造成命名冲突的问题,并且不可以隐式转换成其他类型。
#include <iostream>
using namespace std;
enum class Color
{
RED = 2,
YELLO,
GREEN,
};
int main() {
Color c2 = Color::YELLO;
//cout << c2 << endl; // errno
cout << static_cast<int>(c2) << endl; // 强制转换
return 0;
}
可以用指定类型来存储enum
#include <iostream>
#include <string>
using namespace std;
enum class Color:char;
enum class Color :char
{
RED = 'r',
BLUE
};
int main() {
char c = static_cast<char>(Color::RED);
cout << c << '\n';
char b = static_cast<char>(Color::BLUE);
cout << b << '\n';
return 0;
}
1623

被折叠的 条评论
为什么被折叠?



