学习笔记分享--c++enum(枚举)

学习笔记分享--c++enum(枚举) 日常分享学习笔记环境C11及以上建议C17枚举是什么为什么需要它想象一个场景你要表示一周的七天。新手写法不推荐int today 1; // 1代表周一 int tomorrow 2; // 2代表周二问题来了三个月后你再看代码还记得1是周几吗别人看你代码更懵。用枚举就好多了enum Weekday { MON, TUE, WED, THU, FRI, SAT, SUN }; Weekday today MON; // 一看就懂枚举说白了就是给数字起个好记的名字。MON在计算机里其实就是0TUE是1以此类推。基础用法传统 enum弱枚举先学最基础的写法#include iostream using namespace std; enum Weather { SUNNY, // 默认 0 CLOUDY, // 默认 1 RAINY, // 默认 2 SNOWY // 默认 3 }; //规律递增 int main() { Weather today RAINY; if (today RAINY) { cout 带伞出门 endl; } // 可以比较大小因为背后是数字 if (RAINY SUNNY) { cout RAINY是 RAINY SUNNY是 SUNNY endl; } return 0; }运行结果带伞出门 RAINY是2SUNNY是0手动指定数值默认从0开始你也可以自己定enum HttpStatus { OK 200, NOT_FOUND 404, SERVER_ERROR 500 }; // 不指定数值的会自动递增 enum Grade { A 90, B 80, C 70, D // C是70D是71根据上一项递增 }; // 结果A90, B80, C70, D71注意后面的值会基于上一个明确指定的值递增。传统 enum 的两个坑新手容易踩坑1名字冲突enum Color { RED, GREEN, BLUE }; enum Fruit { APPLE, ORANGE, // RED // 错误RED已经在上面用过了 };RED、GREEN这些名字会泄露到整个代码区域不能重复。坑2隐式转换挺危险的enum Color { RED, GREEN, BLUE }; Color c RED; int num c; // 合法RED变成了0 c 100; // 也合法但这是个bug100不是任何颜色不小心把整数赋给枚举变量编译器不报错程序可能会莫名其妙出问题。现代C的解决方案enum class强枚举推荐C11 加入了enum class专门解决上面的问题。enum class Color { RED, GREEN, BLUE }; enum class Fruit { APPLE, ORANGE, BANANA // 和Color里的名字不冲突了 }; int main() { Color c Color::RED; // 必须加上 Color:: // int num c; // 错误不能自动转成整数 // c 100; // 错误不能直接赋整数 // 要转整数必须强制转换 int num static_castint(c); // num 0 // 比较两个不同枚举不行 // if (c Fruit::APPLE) {} // 编译错误类型不同 return 0; }建议以后写枚举统一用enum class只多打几个字省去很多麻烦。实际应用场景场景1游戏状态机enum class GameState { MENU, // 菜单界面 RUNNING, // 游戏中 PAUSED, // 暂停 GAME_OVER // 游戏结束 }; GameState currentState GameState::MENU; void UpdateGame() { switch (currentState) { case GameState::MENU: // 显示菜单 break; case GameState::RUNNING: // 更新游戏逻辑 break; case GameState::PAUSED: // 暂停界面 break; case GameState::GAME_OVER: // 显示分数 break; } }场景2选项设置enum class Difficulty { EASY, NORMAL, HARD }; void SetDifficulty(Difficulty d) { switch (d) { case Difficulty::EASY: enemyHealth 50; break; case Difficulty::NORMAL: enemyHealth 100; break; case Difficulty::HARD: enemyHealth 200; break; } } // 使用 SetDifficulty(Difficulty::HARD);场景3处理用户输入enum class Command { UP, DOWN, LEFT, RIGHT, ATTACK, JUMP }; Command GetInput() { if (键盘按了W) return Command::UP; if (键盘按了S) return Command::DOWN; if (键盘按了A) return Command::LEFT; if (键盘按了D) return Command::RIGHT; if (键盘按了J) return Command::ATTACK; if (键盘按了K) return Command::JUMP; // 默认返回 return Command::UP; }常用技巧技巧1打印枚举值enum class不能直接打印需要手动转enum class Color { RED, GREEN, BLUE }; Color myColor Color::GREEN; // 方法1直接转整数 cout static_castint(myColor) endl; // 输出 1 // 方法2写个转换函数一劳永逸 string ColorToString(Color c) { switch (c) { case Color::RED: return 红色; case Color::GREEN: return 绿色; case Color::BLUE: return 蓝色; default: return 未知; } } cout ColorToString(myColor) endl; // 输出 绿色技巧2让枚举从1开始enum class Month { JAN 1, // 从1开始符合日常习惯 FEB, MAR, // ... 自动递增2,3,... DEC 12 };技巧3节省内存嵌入式或游戏开发// 默认可能占4字节 enum class Status { IDLE, RUN, JUMP }; // 明确指定用1字节0~255够用了 enum class Status : char { //这里手动指定枚举的类型是char IDLE, RUN, JUMP };一般不用操心这个但如果你要存很多枚举值比如一万个敌人状态就有用了。常见问题Q枚举和#define宏有什么区别A宏只是文本替换没有类型检查。枚举有类型编译器能帮你查错。Q我该用enum还是enum classA新手无脑用enum class。除非你要和老代码对接否则别用传统enum。Q能把枚举当函数参数传吗A当然可以上面例子都是。Q怎么遍历枚举的所有值AC 没有直接方法。简单的做法是自己搞个数组constexpr Color allColors[] {Color::RED, Color::GREEN, Color::BLUE};总结特性传统 enumenum class作用域全局泄露需要枚举名::隐式转int可以危险不可以安全不同类型混用可以容易错不可以新手推荐度⭐⭐⭐⭐⭐⭐⭐记住核心原则用enum class给常量起好名字代码会清晰很多。如果对你有帮助的话请留下个小小的赞蟹蟹