enum的主要缺点

1、类型不明确

  1. 首先,无法指定数据类型,导致我们无法明确枚举类型所占的内存大小。这种麻烦在结构体当中尤为突出,特别是当我们需要内存对齐和填充处理的时候。

    #include <iostream>
    
    enum Version { Ver1 = 1, Ver2, Ver3 };
    
    struct MyStruct {
    MyStruct(Version ver) { this->Ver = ver; }
    Version Ver;
    //Ohters...
    }; int main() {
    MyStruct m(Version::Ver1);
    std::cin.get();
    return 0;
    }

    此时我们的解决办法还是:不使用enum

    #include <iostream>
    
    enum Version { Ver1 = 1, Ver2, Ver3 };
    
    struct MyStruct {
    MyStruct(Version ver) { this->Ver = ver; }
    unsigned char Ver;//将enum Version转为unsigned char类型
    //Ohters...
    }; int main() {
    MyStruct m(Version::Ver1);
    std::cin.get();
    return 0;
    }
  2. 其次,当我们使用enum时,我们无法决定编译器底层是如何对待enum的(比如:signedunsigned)。

    #include <iostream>
    
    enum MyEnum { num1 = 1, num2 = 2, numn = 0xFFFFFF00U };
    
    int main() {
    std::cout << num1 << std::endl;
    std::cout << num2 << std::endl;
    std::cout << numn << std::endl;
    std::cin.get();
    return 0;
    }

    VS2015运行结果:

    1
    2
    -256

    CodeBlocks运行结果:

    1
    2
    4294967040

    numn=0xFFFFFF00U;中,我们希望0xFFFFFF00表现为unsigned。但是不同的编译器其标准也不同。这就给我们的程序带来了许多的不确定性。

2、enum的作用域

例如:

#include <iostream>
enum color{red,blue};//定义拥有两个成员的enum,red和blue在enum的大括号外部可以直接访问,而不需要使用域运算符。
int main() {
std::cout << blue << std::endl;
std::cin.get();
return 0;
} // 结果为1

就如上面的代码,我们可以在blue的大括号之外访问它,color的成员被泄露到了该文件的全局作用域中(虽然它尚不具备外部链接性)。可以直接访问,而不需要域运算符的帮助。但是这不是关键,有时我们反而觉得非常方便。下面才是问题所在:

  • 问题:无法定义同名的枚举成员

    enum color { red, blue };
    //enum MyEnum { red, yellow }; ERROR, 重定义;以前的定义是“枚举数”
  • 解决:可以使用命名空间,但形式上略显麻烦。

enum classenum struct

1、声明:

enum class Name : TypeName {name1, name2......};

2、类型转换保护

与整形之间不会发生隐式类型转换,但可以强制转换

#include <iostream>

enum class color { red, green, yellow};

int main() {
//int res(color::red); //ERROR , “初始化”: 无法从“color”转换为“int”
//color col(2);//ERROR , “初始化”: 无法从“int”转换为“color” //强转
int res(static_cast<int>(color::red));//OK
color col(static_cast<color>(1));//OK std::cin.get();
return 0;
}

3、指定底层数据类型

enum class color:unsigned char{red,blue};
enum calss colorb:long long{yellow,black};

4、作用域

#include <iostream>

enum class color { red, green, yellow};
enum class colorX { red, green, yellow }; int main() {
//使用域运算符访问枚举体成员,强转后打印
std::cout << static_cast<int>(color::red) << std::endl;
std::cout << static_cast<int>(colorX::red) << std::endl;
std::cin.get();
return 0;
}

参考:C++11的enum class & enum struct和enum

enum class 用法的更多相关文章

  1. Python Enum 枚举 用法汇总

    Python Enum 枚举 用法汇总 import os import sys if sys.version_info.major + sys.version_info.minor * 0.1 &l ...

  2. 李洪强iOS开发之 - enum与typedef enum的用法

    李洪强iOS开发之 - enum与typedef enum的用法 01 - 定义枚举类型 上面我们就在ViewController.h定义了一个枚举类型,枚举类型的值默认是连续的自然数,例如例子中的T ...

  3. 【转】Java enum的用法详解

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  4. Java enum的用法详解[转]

    Ref:http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html 用法一:常量 在JDK1.5 之前,我们定义常量都是: p ...

  5. Java enum的用法详解

    (转自:http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html) 用法一:常量 在JDK1.5 之前,我们定义常量都是: ...

  6. c#中enum的用法小结

    转自:http://blog.csdn.net/moxiaomomo/article/details/8056356 enums枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存 ...

  7. enum与typedef enum的用法

    一,两者的用法 枚举类型定义用关键字enum标识,形式为: enum 标识符 { 枚举数据表 }:枚举数据(枚举常量)是一些特定的标识符,标识符代表什么含义,完全由程序员决定.数据枚举的顺序规定了枚举 ...

  8. Java enum的用法详解 (转)

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  9. [Java基础] Java enum的用法详解

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  10. Java中的Enum(枚举)用法介绍

    1. 关于Java Enum:学过C/C++等语言的人,应该都对Enum类型略知一二.Enum一般用来表示一组相同类型的常量.如性别.日期.月份.颜色等.对这些属性用常量的好处是显而易见的,不仅可以保 ...

随机推荐

  1. webrtc终极版(一)5分钟搭建多人实时会议系统webrtc

    webrtc终极版(一),支持https,在线部署[不是本地demo],采用RTCMultiConnection官方demo,5分钟即可搭建成功 @ 目录 webrtc终极版(一),支持https,在 ...

  2. 洛谷P2241 统计方形 ,棋盘问题升级板,给出格子坐标中矩形以及正方形的计算方法

    在做这道题之前我们先了解一下棋盘问题 棋盘问题 (qq.com) 对于棋盘问题,我们可以得出对于一个n*n的正方形方格阵如何求其包含的正方形个数       也就是数每个正方形的中间点,然后将其点排列 ...

  3. 记录一则ADG备库报错ORA-29771的案例

    有客户找到我这边咨询,说他们的一套核心ADG库在业务高峰期报错,因为业务做了读写分离,其备库也实际承担读业务,所以备库故障也会对业务产生影响. 这里也要提醒大家,做读写分离,如果读库出现故障的情况,要 ...

  4. IntPtr 来把指针转换为 Int

    由于想得到指针的值,这个时候,不能把指针强制转换为 integer 因为 integer 只适合32位的系统,64位的系统下,需要用 int64, 通过这个函数来转换,就可以屏蔽掉系统是32位 还是 ...

  5. JS Leetcode 80. 删除有序数组中的重复项 II题解,常规解法与快慢双指针做法

    壹 ❀ 引 今天的题目来自LeetCode80. 删除有序数组中的重复项 II,是一道难度中等,但实际挺简单的一道题,题目描述如下: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每 ...

  6. NC19999 [HAOI2016]放棋子

    题目链接 题目 题目描述 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子也满足每行 ...

  7. Jenkins安装和Host key verification failed问题的处理

    在Centos7上安装的Jenkins 2.303.1 命令行安装为服务 因为新版本的Jenkins的war是用java -jar启动, 并且无法后台运行, 所以要么通过screen创建一个sessi ...

  8. spring boot中配置网页语言国际化

    项目地址:https://gitee.com/indexman/spring_boot_in_action 开发步骤 1.编写国际化配置文件 场景是给登录页面 login.html添加国际化支持. 2 ...

  9. webservice之jax-ws实现方式(服务端)

    1.什么是webservice? webservice是一种远程资源调用技术,它的实现方式主要分为两种, 第一种是jaxws方式,它是面向方法的,它的数据类型是xml是基于soap实现传输: 第二种是 ...

  10. pytho代码分析示例

    a = 5 b = 6 c = 10 for i in range(n): for j in range(n): x = i * j y = j * j z = i * j for k in rang ...