本篇文章来讲一下C++强枚举类型
传统枚举类型的弊端:
大家先来看以下代码:
#include <iostream> enum Color { RED, GREEN, BLUE }; int main() { Color color1 = RED; Color color2 = BLUE; if (color1 == color2) { std::cout << "两个颜色相同" << std::endl; } else { std::cout << "两个颜色不同" << std::endl; } return 0; }
在这个示例中,我们定义了一个名为
Color
的枚举类型,其中包含了RED
、GREEN
和BLUE
三种可能的值。然后,我们在主函数中声明了两个变量:color1
和color2
,并分别将其赋值为不同的枚举常量。接下来,在条件语句中使用等号运算符进行比较操作,判断两个颜色是否相同。如果相同,则输出"两个颜色相同";否则,输出"两个颜色不同"。
这段代码就很好的说明几个问题
1.此代码中两个枚举类型的变量进行了比较 在这其中就发生了隐式类型转换 转换成整型 然后 式子的返回值返回的是bool类型
2.无法指定枚举类型的底层类型
老版本的枚举类型无法明确底层类型 在不同的编译器上面会有不同的结果 请大家看代码实例:
#include <iostream> using namespace std; enum E { e1 = 1, e2 = 1, e3 = 0x132 }; int main(int argc,char*argv[]) { bool b = e1 < e3; cout << boolalpha << b << endl; return 0; }
代码介绍:
boolalpha
是一个标准C++库中的控制输出流中布尔值的格式选项。通过使用std::boolalpha
,可以将布尔值以字符串形式进行输出。一般情况下输出的是1和0这同样的代码 在使用不同的编译器进行跨平台的操作时 结果是不一样的(windows/linux/macos)
强枚举类型
综合以上的问题C++推出了强枚举类型 以下是对强枚举类型的介绍:
1.枚举标识符属于强枚举类型的作用域
2.枚举标识符不会转换成为整型
3.能指定强枚举类型的底层类型 底层类型默认是int类型
4.格式是enum 后面加class关键字即可
#include <iostream> using namespace std; enum class Heighschool { student, teacher, headmaster }; enum class University { student, professor, principal }; int main(int argc,char*argv[]) { Heighschool x = student;//编译失败 在不说明强枚举类型的情况下无法访问到枚举类型内部标识符 bool b = Heighschool::student < University::professor;//编译失败 无法隐式转换成int 比较的类型不同 int c = Heighschool::student;//编译失败 无法隐式转换成int return 0; }
以上代码是对特性1 特性2的详细使用 编译失败的原因:
1.编译失败 在不说明强枚举类型的情况下无法访问到枚举类型内部标识符
2.编译失败 无法隐式转换成int 比较的类型不同
3.编译失败 无法隐式转换成int
C++17开始列表初始化可以用于有底层类型的枚举类型对象(注意强枚举类型的默认底层对象是int 就算没有显示的指定底层的对象 也可以使用 不能使用={}的形式 否则会报错)
#include <iostream> using namespace std; enum class Color { Blue, Green, black }; int main() { Color c1{ 5 }; //Color c2 = { 6 };//报错 不使用列表初始化不能通过编译 return 0; }
使用using打开强枚举类型的命名空间 意义:可以在频繁使用强枚举类型的标识符中简化代码
以下为代码片段
enum class color { Green, Red, Black }; switch(1) { using enum MyEnum; case Red: cout << "hellow red" << endl; //case Color::red cout<<"red"<<endl; }
在上面的例子中,通过
using namespace MyEnum
将MyEnum
的命名空间引入到了switch()
x循环中,这样就可以直接使用 Red等枚举值而无需写出完整的命名空间限定符。总结:强枚举类型的出现很大程度上改变了传统枚举类型的各种弊端 虽然使用起来比传统枚举类型显得稍显复杂 C++20也给了我们解决方案 无论是从跨平台的角度或者是安全性的角度出发 使用C++强枚举类型都是我们优先考虑的枚举类型。
好了 本篇文章就到这里 在这里 小编想向大家分享一个课程: