Consolexin's blog Consolexin's blog
首页
  • 算法基础

    • 图论
    • 字符串
    • 动态规划
    • 二分
    • 滑动窗口
    • 排序
  • Project

    • CppServer
  • 相关书籍

    • 现代C++编程
  • 书籍

    • SQL必知必会
    • MySQL必知必会
分类
标签
归档
GitHub (opens new window)

Consolexinhun

小学生
首页
  • 算法基础

    • 图论
    • 字符串
    • 动态规划
    • 二分
    • 滑动窗口
    • 排序
  • Project

    • CppServer
  • 相关书籍

    • 现代C++编程
  • 书籍

    • SQL必知必会
    • MySQL必知必会
分类
标签
归档
GitHub (opens new window)
  • enum-struct-control_flow

    • enum
    • struct_union
  • memory_management

  • modern_cpp_programming
  • enum-struct-control_flow
consolexinhun
2022-08-04

enum

enum 是一组 整型 常量的组合

enum color_t { BLACK, BLUE, GREEN };
color_t color = BLUE;
cout << (color == BLACK); // print false
1
2
3

下面的问题:颜色和水果在语义上不能够拿来比较

enum color_t { BLACK, BLUE, GREEN };
enum fruit_t { APPLE, CHERRY };
color_t color = BLACK; // int: 0
fruit_t fruit = APPLE; // int: 0
cout << (color == fruit); // print 'true'!!
// and, most importantly, does the match between a color and
// a fruit make any sense?
1
2
3
4
5
6
7

enum class 是 C++ 11的数据类型,不会隐式地转为 int 类型

enum class Color { BLACK, BLUE, GREEN };
enum class Fruit { APPLE, CHERRY };
Color color = Color::BLUE;
Fruit fruit = Fruit::APPLE;
// cout << (color == fruit); // compile error
// we are trying to match colors with fruits
// BUT, they are different things entirely
// int a = Color::GREEN; // compile error
1
2
3
4
5
6
7
8

枚举类可以拿来比较,不支持算数运算

enum color_t { RED, GREEN, BLUE };
enum class Color { RED, GREEN, BLUE };
cout << (Color::RED < Color::GREEN); // print true
int v1 = RED + GREEN; // ok
//int v2 = Color::RED + Color::GREEN; // compile error
1
2
3
4
5

枚举类自动升序排序

enum class Color { RED, GREEN = -1, BLUE, BLACK };
// (0) (-1) (0) (1)
Color::RED == Color::BLUE; // true

1
2
3
4

枚举类包含别名

enum class Device { PC = 0, COMPUTER = 0, PRINTER };
1

枚举类可以显式转换

int a = (int) Color::GREEN; // ok
1

可以设置枚举类的大小

#include <cstdint>
enum class Color : int8_t { RED, GREEN, BLUE };

1
2
3

C++ 17 枚举类支持 直接列表初始化

enum class Color { RED, GREEN, BLUE };
Color a{2}; // ok, equal to Color:BLUE
// Color b{4}; // compile error
1
2
3

C++ 20 允许在局部作用域中使用枚举标识,减少冗余代码

enum class Color { RED, GREEN, BLUE };
    switch (x) {
    using enum Color; // C++20
    case RED:
    case GREEN:
    case BLUE:
}
1
2
3
4
5
6
7

枚举类应该进行初始化

enum class Color { RED, GREEN, BLUE };
Color my_color; // "my_color" may be outside RED, GREEN, BLUE!!
1
2

C++17 中,将超出范围的值转为枚举类型会导致未定义行为

enum Color { RED, GREEN, BLUE };
Color value = (int) 3; // undefined behavior, "value" is undefined
1
2
编辑 (opens new window)
上次更新: 2025/05/21, 06:42:57
struct_union

struct_union→

最近更新
01
6-其他操作
05-20
02
4-联结
05-20
03
7-管理
05-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Consolexinhun | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×