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++ 类型枚举的用法和特性 #### 定义与声明 类型枚举(`enum class` 或 `enum struct`)提供了一种更安全的方式来定义一组命名常量。相比传统的枚举类型枚举具有更好的作用域控制和类型安全性。 ```cpp // 使用 enum class 声明类型枚举 enum class Color { Red, Green, Blue }; ``` 这种语法不仅限定了枚举成员的作用范围,还防止了不同枚举之间的隐式转换[^1]。 #### 类型安全性和作用域隔离 传统枚举的一个缺点是在同一个作用域下可能会发生名称冲突。而类型枚举通过限定其作用域解决了这一问题: ```cpp void printColor(Color c) { switch(c) { case Color::Red: std::cout << "red"; break; case Color::Green: std::cout << "green"; break; case Color::Blue: std::cout << "blue"; break; } } ``` 上述代码展示了如何访问类型枚举中的元素——必须显式指定所属的枚举名作为前缀[^2]。 #### 防止意外混用不同类型的数据 由于编译器会严格区分不同的枚举类型,因此不会允许将两个不同类型的枚举值相互比较或赋值给对方,除非有明确的制转换操作。 ```cpp enum class Direction { North, South }; enum class Status { Active, Inactive }; Direction d = Direction::North; Status s = static_cast<Status>(d); // 编译错误:无法直接转换 ``` 这有助于减少程序中潜在的逻辑错误并提高代码质量。 #### 显式的底层数据类型设定 可以为类型枚举指定期望使用的整数类型,默认情况下是 int 。这对于节省内存或者与其他系统交互时非常有用。 ```cpp enum class ErrorCode : uint8_t { Success = 0, Failure = 1 }; ``` 这里使用了较小的 unsigned char 来存储枚举值,在资源受限环境中特别有价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值