面试题:C++ 中 enum 和 enum class 的区别?

在 C++ 中,enumenum class 都用于定义枚举类型,但它们有显著的区别,主要体现在作用域、类型安全和隐式转换方面。


1. 作用域(Scope)

  • enum(传统枚举)
    • 枚举值是暴露在枚举类型所在的作用域中的,容易造成命名冲突。
    • 例如:
      enum Color { Red, Green, Blue };
      enum TrafficLight { Red, Yellow, Green }; // 错误:Red 和 Green 冲突
      这里的 RedGreen 会与 Color 中的枚举值冲突。
  • enum class(强类型枚举)
    • 枚举值的作用域限定在枚举类型内部,不会污染外部作用域。
    • 例如:
      enum class Color { Red, Green, Blue };
      enum class TrafficLight { Red, Yellow, Green }; // 正确:不会冲突
      使用时需要显式指定作用域,如 Color::RedTrafficLight::Red

2. 类型安全(Type Safety)

  • enum
    • 枚举值可以隐式转换为整数类型,容易引发类型安全问题。
    • 例如:
      enum Color { Red, Green, Blue };
      int x = Red; // 隐式转换为 int
      这种隐式转换可能导致意外的行为。
  • enum class
    • 枚举值不能隐式转换为整数类型,必须显式转换。
    • 例如:
      enum class Color { Red, Green, Blue };
      int x = static_cast<int>(Color::Red); // 必须显式转换
      这种设计提高了类型安全性。

3. 底层类型(Underlying Type)

  • enum
    • 底层类型由编译器决定,通常是 int,但不能显式指定。
    • 例如:
      enum Color { Red, Green, Blue }; // 底层类型可能是 int
  • enum class
    • 可以显式指定底层类型(如 intchar 等),便于控制内存占用和性能。
    • 例如:
      cpp enum class Color : char { Red, Green, Blue }; // 底层类型为 char

4. 默认初始化

  • enum
    • 枚举值可以隐式转换为整数,因此可以直接用整数初始化。
    • 例如:
      enum Color { Red, Green, Blue };
      Color c = 1; // 合法,但可能不安全
  • enum class
    • 枚举值不能隐式转换为整数,必须显式初始化。
    • 例如:
      enum class Color { Red, Green, Blue };
      Color c = Color::Green; // 必须显式指定

总结对比

特性enum(传统枚举)enum class(强类型枚举)
作用域枚举值暴露在外部作用域枚举值限定在枚举类型内部
类型安全隐式转换为整数,不安全不能隐式转换,更安全
底层类型由编译器决定,不能指定可以显式指定底层类型
默认初始化可以用整数初始化必须显式初始化

使用建议

  • 如果需要避免命名冲突和提高类型安全性,优先使用 enum class
  • 如果需要与 C 代码兼容或需要隐式转换为整数,可以使用 enum
THE END
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容