C++ “美中不足” --->强枚举类型

本篇文章来讲一下C++强枚举类型

传统枚举类型的弊端:
大家先来看以下代码:

#include 

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的枚举类型,其中包含了REDGREENBLUE三种可能的值。然后,我们在主函数中声明了两个变量:color1color2,并分别将其赋值为不同的枚举常量。

接下来,在条件语句中使用等号运算符进行比较操作,判断两个颜色是否相同。如果相同,则输出"两个颜色相同";否则,输出"两个颜色不同"。

这段代码就很好的说明几个问题

1.此代码中两个枚举类型的变量进行了比较 在这其中就发生了隐式类型转换 转换成整型 然后 式子的返回值返回的是bool类型 

2.无法指定枚举类型的底层类型

老版本的枚举类型无法明确底层类型 在不同的编译器上面会有不同的结果 请大家看代码实例:

#include 
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 
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 
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"<

在上面的例子中,通过 using namespace MyEnumMyEnum 的命名空间引入到了 switch() x循环中,这样就可以直接使用 Red等枚举值而无需写出完整的命名空间限定符。

总结:强枚举类型的出现很大程度上改变了传统枚举类型的各种弊端 虽然使用起来比传统枚举类型显得稍显复杂  C++20也给了我们解决方案 无论是从跨平台的角度或者是安全性的角度出发 使用C++强枚举类型都是我们优先考虑的枚举类型。

好了 本篇文章就到这里 在这里 小编想向大家分享一个课程:

https://xxetb.xetslk.com/s/2PjJ3T

你可能感兴趣的:(C++,新特性,c++,开发语言)