C++ 枚举(enum)

C++ 中,枚举(enum)是一种数据类型,可以定义一组命名的整型常量。枚举使得代码更具可读性和可维护性,通过为常量赋予有意义的名字,避免了直接使用数字的情况。这些常量通常表示一系列相关的值,使得代码更加可读和维护。

1、enum关键字

enum是C++中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组数据的集合,枚举型是预处理指令#define的替代,枚举和宏定义其实非常类似,宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值,

#include <iostream>

enum Day {
    Sunday,    // 默认值 0
    Monday,    // 1
    Tuesday,   // 2
    Wednesday, // 3
    Thursday,  // 4
    Friday,    // 5
    Saturday   // 6
};

int main() {
    Day today = Wednesday;  // 将 today 设置为 Wednesday
    std::cout << "Day number: " << today << std::endl;  // 输出 3
    return 0;
}

2、定义枚举

枚举数据(枚举常量)是一些特定的标识符,标识符代表什么含义,完全由程序员决定。数据枚举的顺序规定了枚举数据的序号,默认从0开始,依次递增。默认情况下,枚举的底层类型是 int,但可以指定其他整型类型。可以显式指定枚举常量的值。

1)先声明后定义

#include <iostream>
using namespace std;
enum RGB
{  
    R,G,B
};  
int main() {
  enum RGB rgb=G;
  cout << rgb << endl;
  return 0;
}

2)同时声明和定义

#include <iostream>
using namespace std;
int main() {
  enum RGB
  {  
    R,G,B
  }  rgb;  
  rgb=B;
    cout << rgb << endl;
  return 0;
}

3)直接定义

#include <iostream>
using namespace std;
int main() {
  enum 
  {  
    R,G,B
  }  rgb;  
  rgb=B;
    cout << rgb << endl;
  return 0;
}

枚举值默认是从0开始,也可以显示指定。

例如,

#include <iostream>
using namespace std;
int main() {
  enum 
  {  
    R=2,G,B
  }  rgb;  
  rgb=B;
    cout << rgb << endl;
  return 0;
}

3、枚举使用示例

定义星期枚举类型,并将初始值指定为1。可以显式指定枚举常量的值。

例如,

#include <iostream>
using namespace std;
/* 定义枚举类型 */
enum DAY { MON=1,TUE,WED,THU,FRI,SAT,SUN};
int main()
{
    /* 使用枚举类型声明变量,再对枚举型变量赋值 */
    enum DAY yesterday, today, tomorrow;
    yesterday = MON;
    today = TUE;
    tomorrow = WED;
    cout << yesterday << " " << today << " " << tomorrow << endl;
    return 0;
}

4、枚举转换

枚举类型和int类型可以转换,我们可以转将int类型转换成枚举类型。

例如,

#include <iostream>
using namespace std;
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
int main()
{
  enum DAY yesterday,today,tomorrow;
  yesterday = TUE;
  today = (enum DAY) (yesterday + 1);//类型转换
  tomorrow = (enum DAY) 30; //类型转换
  cout << yesterday << " " << today << " " << tomorrow << endl;
  return 0;
}

5、枚举的底层类型

C++11 引入了强类型枚举(enum class),它可以指定枚举的底层类型,同时避免了枚举值与其他类型值的混淆。

#include <iostream>
using namespace std;

enum class Color : unsigned char {
    Red = 1,
    Green = 2,
    Blue = 3
};

void printColor(Color color) {
    switch(color) {
        case Color::Red:
            std::cout << "Color is Red" << std::endl;
            break;
        case Color::Green:
            std::cout << "Color is Green" << std::endl;
            break;
        case Color::Blue:
            std::cout << "Color is Blue" << std::endl;
            break;
        default:
            std::cout << "Unknown color" << std::endl;
    }
}

int main() {
    Color myColor = Color::Green;  // 使用枚举值

    // 打印枚举值
    printColor(myColor);
    
    // 可以通过强制类型转换获取枚举的整数值
    unsigned char colorValue = static_cast<unsigned char>(myColor);
    std::cout << "Integer value of color: " << static_cast<int>(colorValue) << std::endl;

    return 0;
}

6、枚举与位标志(flags)

如果枚举代表一组位标志,可以通过位操作(如 |&)组合枚举值。

#include <iostream>
using namespace std;

enum class Permission : unsigned int {
    Read = 1 << 0,    // 1
    Write = 1 << 1,   // 2
    Execute = 1 << 2  // 4
};

// 使用位运算符组合权限
Permission operator|(Permission lhs, 
Permission rhs) {
    return static_cast<Permission>
    (static_cast<unsigned int>(lhs) 
    | static_cast<unsigned int>(rhs));
}

int main() {
    // 使用位运算符组合权限
    Permission p = Permission::Read | Permission::Write;
    
    // 检查是否有写权限
    if (static_cast<unsigned int>(p) 
    & static_cast<unsigned int>(Permission::Write)) {
        std::cout << 
        "Write permission granted" << std::endl;
    }

    // 检查是否有执行权限
    if (static_cast<unsigned int>(p) 
    & static_cast<unsigned int>(Permission::Execute)) {
        std::cout << 
        "Execute permission granted" << std::endl;
    } else {
        std::cout << 
        "Execute permission denied" << std::endl;
    }

    return 0;
}

推荐阅读
cjavapy编程之路首页