C++11 强类型枚举相关总结

 更新时间:2021年02月26日 11:03:33   作者:多半是条废龙  
这篇文章主要介绍了C++11 强类型枚举的相关资料,帮助大家更好的理解和学习使用c++11,感兴趣的朋友可以了解下

枚举就是定义一个类别,并且穷举统一类别下的个体以供代码使用。

C++98 枚举存在的缺陷:

  • 无论是具名枚举的名字还是枚举类型中的成员,都是全局范围的,其作用域是全局的。 如果在不同的枚举中定义了相同的枚举成员,则会出现重复声明(redeclaration)错误。
enum PUBLIC_COLOR { RED, YELLOW, GREEN };
enum PRIVATE_COLOR { RED, BLACK, PURPLE };  // RED 重定义
enum PUBLIC_COLOR { WHITE, GRAY };				// PUBLIC_COLOR 重定义

int main() {
 int color = RED;

 cout << color << endl;
}

你可能会想到使用命名空间来封装枚举类型,但是如果其中的某个命名空间漏写了名字则会变成匿名空间,而匿名空间中的所有枚举成员会默认变成全局命名空间下的成员。因此这种方法是不合适的。

  • 枚举中的成员被设计为常量数字的别名,因此可以隐式的转换为 int 类型,但是这在某些时候是不被期望出现的。
  • 枚举类型锁占用的空间大小以及符号不确定。

C++11 中的强枚举类型语法格式

enum class enum_name: elem_type { elem1, elem2, ... };

C++11 强枚举类型的优点

  • 强作用域,强类型枚举成员的名称不会被输出到其父作用域空间。
enum class PUBLIC_COLOR { RED, GREEN, BLACK }; // ok
enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 }; // ok
  • 转换限制,强类型枚举成员的值不可以与整形隐式地相互转换。
enum class PUBLIC_COLOR { RED, GREEN, BLACK };
enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 };

if (PUBLIC_COLOR::GREEN == 1) {  // errror: 未定义可接受的类型转换
 cout << "color1 == 1" << endl;
}

if (PRIVATE_COLOR::PURPLE == 1) { // ok
 cout << "color2 == 1" << endl;
}
  • 可以指定底层类型。强类型枚举默认的底层类型为 int,但也可以显式地指定底层类型。
enum class PUBLIC_COLOR: char { RED, GREEN, BLACK };
enum PRIVATE_COLOR: int { RED, PURPLE, PINK };

cout << sizeof(PUBLIC_COLOR::GREEN) << endl;		// 1
cout << sizeof(PRIVATE_COLOR::PURPLE) << endl;		// 4
  • 不可能对不同的枚举类型的枚举值进行比较。但相同枚举值之间如果指定的值相同,那么可以进行比较。
enum class PUBLIC_COLOR { RED, GREEN, BLACK };
enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 };

if (PUBLIC_COLOR::GREEN == PRIVATE_COLOR::PURPLE) {  // errror
 cout << "PUBLIC_COLOR::GREEN == PRIVATE_COLOR::PURPLE" << endl;
}

if (PRIVATE_COLOR::PURPLE == PRIVATE_COLOR::PINK) {  // ok
 cout << "PRIVATE_COLOR::PURPLE == PRIVATE_COLOR::PINK" << endl;
}
  • 如果想要输出枚举值可以进行强制类型转换
enum class PUBLIC_COLOR: char { RED, GREEN, BLACK };
enum PRIVATE_COLOR: int { RED, PURPLE, PINK };

cout << static_cast<int>(PUBLIC_COLOR::RED) << endl;		// 0
cout << static_cast<int>(PRIVATE_COLOR::PURPLE) << endl;	// 1

以上就是C++11 强类型枚举相关总结的详细内容,更多关于C++11 强类型枚举的资料请关注脚本之家其它相关文章!

相关文章

  • C/C++ 中 void*从概念到实战深度解析

    C/C++ 中 void*从概念到实战深度解析

    本文主要介绍了C/C++中的void*类型,从概念、特性、用途到实战规范进行了全面拆解,void*是一种通用指针,可以指向任意类型的数据,但需要显式转换以使用,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • C++连接数据库SqlServer、MySql、Oracle、Access、SQLite、PostgreSQL、MongoDB、Redis

    C++连接数据库SqlServer、MySql、Oracle、Access、SQLite、PostgreSQL、Mong

    C++是一种通用的编程语言,可以使用不同的库和驱动程序来连接各种数据库,以下是一些示例代码,演示如何使用 C++ 连接 SQL Server、MySQL、Oracle、ACCESS、SQLite 、 PostgreSQL、MongoDB、Redis数据库
    2024-08-08
  • 利用C语言实现扫雷游戏

    利用C语言实现扫雷游戏

    这篇文章主要为大家详细介绍了利用C语言实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C语言柔性数组详解

    C语言柔性数组详解

    这篇文章主要介绍了C语言柔性数组,通过实例分析了不完整类型、结构体及柔性数组等概念,需要的朋友可以参考下,希望能够给你带来帮助
    2021-10-10
  • C语言实现跨文件传输数据的几种方式

    C语言实现跨文件传输数据的几种方式

    C语言是一种强大的、通用的编程语言,常用于系统级编程,包括硬件交互,如中断处理和数据采集,在本文中,我们将深入探讨如何使用C语言进行跨文件数据传输,文中有相关的代码供大家参考,需要的朋友可以参考下
    2024-08-08
  • 详解Qt如何实现一键加载qm文件

    详解Qt如何实现一键加载qm文件

    这篇文章主要为大家详细介绍了Qt实现一键加载qm文件的相关方法,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2024-04-04
  • C语言float内存布局示例详解

    C语言float内存布局示例详解

    这篇文章主要为大家介绍了C语言float内存布局示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 一文详解C++的程序流程控制

    一文详解C++的程序流程控制

    这篇文章主要介绍了一文详解C++的程序流程控制,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • C++标准模板库string类的介绍与使用讲解

    C++标准模板库string类的介绍与使用讲解

    今天小编就为大家分享一篇关于C++标准模板库string类的介绍与使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言实现linux网卡检测精简版

    C语言实现linux网卡检测精简版

    这篇文章主要为大家详细介绍了C语言实现linux网卡检测的精简版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06

最新评论