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

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

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

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

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

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 MyEnumMyEnum 的命名空间引入到了 switch() x循环中,这样就可以直接使用 Red等枚举值而无需写出完整的命名空间限定符。

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

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

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

相关文章
|
6月前
|
存储 编译器 Shell
【C++基础语法 枚举】解析 C/C++ 中枚举类型大小值
【C++基础语法 枚举】解析 C/C++ 中枚举类型大小值
74 0
|
5月前
|
存储 安全 API
C++一分钟之-C++中的枚举类型(enum class)
【6月更文挑战第25天】C++的`enum class`(强类型枚举)在C++11中引入,增强了枚举的作用域和类型安全,减少命名冲突。它要求使用全名(如`Color::Green`)访问枚举成员,并能显式指定底层类型。常见问题包括默认值非0、隐式转换和范围溢出,解决办法是明确赋值、显式转换和选择合适底层类型。高效技巧包括用于状态机、作为函数参数、创建别名和迭代。掌握这些能提升代码质量。
168 0
|
6月前
|
安全 C++
C++程序中的枚举类型
C++程序中的枚举类型
55 1
|
6月前
|
程序员 测试技术 C++
[C++] enum枚举类型用法
[C++] enum枚举类型用法
103 0
|
C++
【C++知识点】枚举类型
【C++知识点】枚举类型
141 0
|
C++
C++ 用枚举类型替代宏定义连续的常量
C++ 用枚举类型替代宏定义连续的常量
108 0
|
C语言 C++
C++ 结构体 共用体 枚举类型 自定义数据类型 宏定义解析
C++ 结构体 共用体 枚举类型 自定义数据类型 宏定义解析
151 0
|
C++ 知识图谱
2013级C++第1周(春)项目——枚举类型与结构体初步
课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759 【项目0-闲谈几点】  学习信息技术的大学生,在初接触行业,就能够进入到专业社区,有机会了解行业最新进展、享受海量资源、接触专业人士、获得实践机会,也给自己创造了一个全新、开放的展示空间,我们可以拥抱这样的机会。  与互联网相关的大学生,学习程序设计课程过程中,就同互
993 0