当前位置: 首页 > article >正文

C++11中新引入的enum类型

一、引言

        在C++11中,引入了一个新的枚举类型——enum class(或称为作用域枚举类型),它相较于传统的enum类型有几个关键的不同点。enum class提供了更强的类型检查和封装,减少了命名冲突的可能性,并允许更加清晰地表达枚举的意图。

二、传统枚举(enum)的缺点

        在C++11之前,枚举(enum)类型是隐式转换为整型的,这可能会导致一些意料之外的类型安全问题。此外,传统枚举的作用域是从声明点到声明该枚举的文件末尾,这可能会导致在不同上下文中名称的冲突。

enum LightColor{
	RED, GREEN, YELLOW
};

enum ClothesColor{
	RED, GREEN, YELLOW    // 此处会报重复声明的错误,因为LightColor枚举中已经声明了RED等
};

int main(){
	LightColor color1 = RED;
	ClothesColor color2 = RED;
}

以上代码会有编译错误,因为LightColor中声明了RED,而在ClothesColor中又声明了RED,因此两者冲突。

三、在C++11中避免此冲突

enum class LightColor{
	RED, GREEN, YELLOW
};

enum class ClothesColor{
	RED, GREEN, YELLOW
};

int main(){
    // 在枚举值前加上类型的限定符,表明枚举值是哪个类型的值
    // 这样就可以避免产生冲突了
	LightColor color1 = LightColor::RED;
	ClothesColor color2 = ClothesColor::RED;
}

四、enum class的优点

  • 作用域限定:enum class的成员仅在枚举本身的作用域内可见,需要使用枚举类型名作为前缀来访问其成员,这减少了命名冲突的可能性。
  • 不隐式转换为整型:enum class类型的值不会自动转换为整型(如int),除非显式进行类型转换。这提高了类型安全性。
  • 更好的命名空间支持:enum class可以在更复杂的命名空间中声明,使得枚举的使用更加灵活和清晰。
  • 允许指定底层类型:通过: 底层类型语法,enum class可以指定其底层数据类型(如int、char等),以控制枚举值的存储和表示。
#include <cstdint>

// 指定LightColor的底层使用int8_t整数类型
enum class LightColor: int8_t{
	RED = -1, GREEN = 0, YELLOW = 8
};

五、示例

#include <iostream>  
  
// 定义一个enum class  
enum class Color {  
    RED, GREEN, BLUE  
};  
  
int main() {  
    // 枚举类型的变量声明  
    Color myColor = Color::RED;  
  
    // 正确使用枚举类型  
    if (myColor == Color::RED) {  
        std::cout << "The color is red." << std::endl;  
    }  
  
    // 错误用法:没有前缀Color::会导致编译错误  
    // if (myColor == RED) { // 错误  
  
    // 显示转换为整型(如果需要)  
    int colorValue = static_cast<int>(myColor);  
  
    // 注意:不同的枚举值可以有不同的底层值  
    enum class Status : char {  
        OK = 'a',  
        ERROR = 'b'  
    };  
  
    Status status = Status::OK;  
    char statusChar = static_cast<char>(status);  
  
    return 0;  
}

六、小结

        enum class是C++11引入的一种新的枚举类型,它通过提供作用域限定、避免隐式类型转换以及允许指定底层类型等方式,改进了传统枚举类型(enum)的使用。这使得enum class成为C++11及更高版本中推荐使用的枚举类型。

附:c++11新增的其他性


http://www.kler.cn/a/294177.html

相关文章:

  • 从python源码到可自动更新软件
  • 前端js用canvas合成图片并转file对象
  • LaTeX之四:如何兼容中文(上手中文简历和中文论文)、在win/mac上安装新字体。
  • 高级java每日一道面试题-2024年11月06日-JVM篇-什么是 Class 文件? Class 文件主要的信息结构有哪些?
  • 4-6-2.C# 数据容器 - ArrayList 扩展(ArrayList 注意事项、ArrayList 存储对象的特性、ArrayList 与数组的转换)
  • 前缀和技巧解析
  • 20240903软考架构-------软考111-115答案解析
  • 匈牙利算法实现(from scipy.optimize import linear_sum_assignment)
  • GNN中的Over-smoothing与Over-squashing问题
  • 使用SymbolGlyph和SymbolSpan在HarmonyOS中实现高级图标效果
  • 【扩散模型(十)】IP-Adapter 源码详解 4 - 训练细节、具体训了哪些层?
  • 新加坡裸机云多IP服务器特性
  • java-在idea中antrl的hello world
  • 63、Python之函数高级:装饰器缓存实战,优化递归函数的性能
  • Spring Boot启动卡在Root WebApplicationContext: initialization completed in...
  • TulingMember进销存系统
  • Save OpenAI response in Azure function to Blob storage
  • 简单上手 PIPENV
  • 2024高教社杯数学建模国赛ABCDE题选题建议+初步分析
  • 计算机网络-VRRP工作原理
  • kubelet 探针
  • Vue3:实现路径变量
  • 同时播放多个视频
  • Spring Cloud Gateway整合基于STOMP协议的WebSocket实战及遇到问题解决
  • 基于单片机的家居环境监测系统的设计
  • 项目7-音乐播放器7(测试报告)