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; }