53 C++ 现代C++编程艺术2-枚举和枚举类
C++ 现代C++编程艺术2-枚举和枚举类.md
文章目录
- C++ 现代C++编程艺术2-枚举和枚举类.md
- C语言中的枚举
- C++中的枚举
- 枚举类的用法
C语言中的枚举
成员值只能为int
类型,无法修改。
底层类型由编译器决定(通常为int
),无法手动指定。
- 成员直接暴露在全局作用域,不同枚举的成员名不可重复。
enum Color { RED, GREEN };
enum Signal { RED }; // 错误:RED重复定义
- 允许隐式转换为整型,可能引发逻辑错误:
enum Color { RED, GREEN };
int x = RED; // 直接赋值,无类型检查
#include <stdio.h>
enum SHAPE {CIRLE, RECT, POINT,LINE};
enum WEEK {TUS};int main()
{//用枚举初始换枚举变量enum SHAPE myshape = CIRLE;myshape = RECT;//用非枚举值或者数字,初始化枚举变量enum SHAPE msy = TUS;msy = 23;if(CIRLE == TUS){printf("相等\n");}
return 0;
}
C++中的枚举
c++里的枚举成员值类型可自由定义(如short
、unsigned
等),提升灵活性。
#include <iostream>
using namespace std;
enum SHAPE {CIRLE, RECT, POINT,LINE};
enum WEEK {TUS};int main()
{//用枚举初始换枚举变量SHAPE myshape = CIRLE;myshape = RECT;//用非枚举值或者数字,初始化枚举变量// enum SHAPE msy = TUS;// msy = 23;// if(CIRLE == TUS)//警告if(CIRLE == RECT){printf("相等\n");}
return 0;
}
-
C++枚举类(C++11起)
成员限定在枚举作用域内,需通过枚举名::成员
访问,避免命名冲突:enum class Color { RED, GREEN }; enum class Signal { RED }; // 合法
-
禁止隐式转换,需显式类型转换(如
static_cast
):enum class Color { RED, GREEN }; int x = static_cast<int>(Color::RED); // 必须显式转换
-
支持显式指定底层类型(如
char
、uint16_t
等),优化内存与兼容性:enum class SmallEnum : uint8_t { A, B }; // 占1字节
-
允许前向声明(需指定底层类型):
enum class Color : int; // 前向声明 void setColor(Color c); enum class Color : int { RED, GREEN }; // 后续定义
枚举类的用法
枚举类是强枚举类型
#include <iostream>
using namespace std;
enum class SHAPE {CIRLE, RECT, POINT,LINE};
enum class WEEK {TUS};int main()
{//用枚举初始换枚举变量SHAPE myshape = SHAPE::CIRLE;myshape = SHAPE::RECT;//用非枚举值或者数字,初始化枚举变量// enum SHAPE msy = TUS;// msy = 23;// 错误,类型不同,不能比较if(SHAPE::CIRLE == WEEK::RECT){printf("相等\n");}
return 0;
}