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新增的其他性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hn_tzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值