C++

C++ enum 和 enum class


avatar
GuoYulong 2024-12-05 167

enum 和 enum class

在 C++ 中,枚举(enum)是一种非常常见的类型,用于定义一组有命名的常量。然而,传统的 enum 在某些场景下存在一些局限性,比如作用域污染和类型安全问题。为了改进这些问题,C++11 引入了 enum class,也称为强类型枚举

1.什么是enum

enum 是一种定义枚举类型的方式,用于表示一组相关的常量。其语法如下:

enum EnumName {
    Enumerator1,
    Enumerator2,
    Enumerator3
};

特点:

  • 枚举值是全局的,无需通过枚举类型名称访问。
  • 枚举值可以隐式地转换为整型。

示例代码:

#include <iostream>

enum Color { Red, Green, Blue };

int main() {
    Color color = Red; // 直接使用枚举值

    if (color == 0) { // 隐式转换为整型
        std::cout << "Color is Red" << std::endl;
    }
    return 0;
}

缺点:

  • 枚举值在全局作用域中可能导致命名冲突。
  • 枚举值可以隐式转换为整型,容易引发意外错误。

2.什么是enum class

enum class 是 C++11 引入的增强版枚举,提供更强的类型安全性和作用域管理。其语法如下:

enum class EnumName : UnderlyingType {
    Enumerator1,
    Enumerator2,
    Enumerator3
};

特点:

  • 枚举值是局部作用域的,必须通过 EnumName::Enumerator 访问。
  • 枚举值不能隐式转换为整型,只有显式转换才能完成。
  • 可以显式指定底层类型(UnderlyingType),例如 int, uint8_t 等。

示例代码:

#include <iostream>

enum class Color { Red, Green, Blue };

int main() {
    Color color = Color::Red; // 必须通过作用域访问

    // 不允许隐式转换为整型
    // if (color == 0) { // 错误
    if (static_cast<int>(color) == 0) { // 必须显式转换
        std::cout << "Color is Red" << std::endl;
    }
    return 0;
}

优点:

  • 枚举值有作用域,避免命名冲突。
  • 提供更强的类型安全性。
  • 灵活的底层类型选择。

3.enumenum class 的对比

特性 enum enum class
作用域 枚举值在全局作用域中 枚举值在全局作用域中
类型安全性 可隐式转换为整型 不可隐式转换,必须显式转换
底层类型 通常是 int,不可指定 可指定,例如 uint8_t
代码可读性 不强,可能丢失上下文 强,必须通过作用域访问
向后兼容性 兼容 C 语言 需要支持 C++11 或更高版本

4. 使用场景分析

  • enum 的适用场景:

    • 与 C 语言代码兼容的项目。
    • 枚举值数量较少且无需严格的类型安全性。
  • enum class 的适用场景:

    • 大型项目,避免命名冲突。
    • 对类型安全性和代码可读性有较高要求的场景。
    • 希望优化内存占用时,通过自定义底层类型实现。

5. 代码示例:传统枚举与强类型枚举的比较

#include <iostream>
#include <cstdint>

// 传统枚举
enum Color {
    Red,
    Green,
    Blue
};

// 强类型枚举
enum class Shape : uint8_t {
    Circle,
    Square,
    Triangle
};

int main() {
    // 使用传统枚举
    Color c = Red;
    if (c == 0) { // 隐式转换为整型
        std::cout << "Color is Red (traditional enum)" << std::endl;
    }

    // 使用强类型枚举
    Shape s = Shape::Circle;
    // if (s == 0) { // 错误:不能隐式转换
    if (static_cast<uint8_t>(s) == 0) { // 必须显式转换
        std::cout << "Shape is Circle (enum class)" << std::endl;
    }

    return 0;
}

输出结果:

Color is Red (traditional enum)
Shape is Circle (enum class)

6. 总结

  • enum 是传统的枚举类型,但在作用域和类型安全性方面存在一定缺陷。
  • enum class 是现代 C++ 的增强版枚举,提供更强的类型安全性、更好的作用域管理以及灵活的底层类型支持。
  • 在现代 C++ 编程中,优先使用 enum class,除非需要与 C 语言代码兼容。

相关阅读

注意!!!

新增会员中心页面,方便管理个人账户,充值功能暂不开启,请勿为本网站进行任何充值活动!!!

通知!!!

① 过年好!!!拖更几个月了已经,年后继续更新!!