【C++】enum枚举与强类型枚举

enum

文章目录

enum枚举

C++的enum工具提供了一种创建符号常量的方式,这种方式可以替代const

枚举类型定义用关键字enum标识

cpp 复制代码
enum 标识符 
{
      枚举数据表
};
  • 枚举数据表的值都是整数。第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。也可以人为设定枚举成员的值,从而自定义某个范围内的整数。
  • 可以在定义类型时对枚举常量初始化。
  • 枚举类型可以进行比较。
cpp 复制代码
//Mon的值为1,Tue的值为2,Wed的值为3 ...
enum week {Mon=1,Tue,Wed,Thu,Fri,Sat,Sun};

enum Level {
    UNKNOW = 0,
    DEBUG = 1,
    INFO = 2,
    WARN = 3,
    ERROR = 4,
    FATAL = 5
};
  • Mon,Tue,Wed这些常量被称为枚举量
    枚举量可以直接当作define用
cpp 复制代码
printf("%d",Tue);

枚举变量

cpp 复制代码
enum Month {Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,dec};
//a即为枚举变量
//只能将定义枚举时使用的枚举量赋值给枚举变量
enum Month a =  Feb;

强类型枚举

  • 非强类型枚举的缺陷
cpp 复制代码
- 1.当两个枚举内的成员相同时,由于该成员是全局的,故在使用时会造成混淆,报错;
namespace T {
    enum Type { General, Light, Medium, Heavy };
}

namespace {
    enum Category{ General = 1, Pistol, MachienGun, Cannon };
}

int main() {
    T::Type t = T::Light;
    if(t == General) {// 此处若没有使用T::General,则将会使用上述全局的General
        cout << "-----" << endl;
    }
    return 0;
}

- 2.枚举成员总是阔以被隐式转换为整型
  • 解决方法
cpp 复制代码
C++11采用强类型枚举,在enum后加上一个class;
    - 强作用域,不会被输出到父作用域;
    - 转化限制,不能被隐式转换,比较需要通过显示转换;
    - 可以指定底层类型,在枚举名称后加上`: type`,type不能为wchar_t;
cpp 复制代码
/** 使用强枚举,并指定类型 */
enum class Type : char { General, Light, Medium, Heavy };
enum class Category { General = 1, Pistol, MachienGun, Cannon };

void test() {
    Type t = Type::Light;
    t = General;            // 错误,需要指定名称
    if (t == Category::General) {}  // 错误,不同类型不能比较
    if (t == Type::Light) {}    
    if((int)t > 0) {}       // 强制转换
}

--

相关推荐
AIminminHu几秒前
OpenGL渲染与几何内核那点事-项目实践理论补充(二-1-(1):当你的CAD学会“想象”:图形技术与AI融合的三个层次)
c++·人工智能·几何·cad·几何内核·cad开发
两年半的个人练习生^_^2 分钟前
ThreadLocal的使用和源码
java·开发语言
csbysj20204 分钟前
JSP 语法详解
开发语言
roamingcode5 分钟前
应对 Codex 0.118.0 破坏性更新:Slash Prompt Router 架构解析与实践
java·开发语言·prompt·codex·skill
zzginfo5 分钟前
JavaScript 假值示例详解
开发语言·前端·javascript·ecmascript
421!7 分钟前
C语言学习笔记——10(结构体)
c语言·开发语言·笔记·stm32·学习·算法
551只玄猫8 分钟前
【数学建模 matlab 实验报告5】最短路问题作业
开发语言·数学建模·matlab·课程设计·图论·最短路径·实验报告
不只会拍照的程序猿8 分钟前
《嵌入式AI筑基笔记04:python函数与模块01—从C的刻板到Python的灵动》
c语言·开发语言·笔记·python
ada0_ada110 分钟前
Qt的Widgets项目
开发语言·qt
1104.北光c°13 分钟前
Leetcode146 LRU缓存的三种写法 【hot100算法个人笔记】【java写法】
java·开发语言·笔记·算法·leetcode·hot100·lru缓存