经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++11 强类型枚举
来源:cnblogs  作者:多半是条废龙  时间:2021/3/1 9:33:57  对本文有异议

枚举就是定义一个类别,并且穷举统一类别下的个体以供代码使用。

C++98 枚举存在的缺陷:

  • 无论是具名枚举的名字还是枚举类型中的成员,都是全局范围的,其作用域是全局的。 如果在不同的枚举中定义了相同的枚举成员,则会出现重复声明(redeclaration)错误。

    1. enum PUBLIC_COLOR { RED, YELLOW, GREEN };
    2. enum PRIVATE_COLOR { RED, BLACK, PURPLE }; // RED 重定义
    3. enum PUBLIC_COLOR { WHITE, GRAY }; // PUBLIC_COLOR 重定义
    4. int main() {
    5. int color = RED;
    6. cout << color << endl;
    7. }

    你可能会想到使用命名空间来封装枚举类型,但是如果其中的某个命名空间漏写了名字则会变成匿名空间,而匿名空间中的所有枚举成员会默认变成全局命名空间下的成员。因此这种方法是不合适的。

  • 枚举中的成员被设计为常量数字的别名,因此可以隐式的转换为 int 类型,但是这在某些时候是不被期望出现的。

  • 枚举类型锁占用的空间大小以及符号不确定。

C++11 中的强枚举类型语法格式

  1. enum class enum_name: elem_type { elem1, elem2, ... };

C++11 强枚举类型的优点

  • 强作用域,强类型枚举成员的名称不会被输出到其父作用域空间。

    1. enum class PUBLIC_COLOR { RED, GREEN, BLACK }; // ok
    2. enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 }; // ok
  • 转换限制,强类型枚举成员的值不可以与整形隐式地相互转换。

    1. enum class PUBLIC_COLOR { RED, GREEN, BLACK };
    2. enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 };
    3. if (PUBLIC_COLOR::GREEN == 1) { // errror: 未定义可接受的类型转换
    4. cout << "color1 == 1" << endl;
    5. }
    6. if (PRIVATE_COLOR::PURPLE == 1) { // ok
    7. cout << "color2 == 1" << endl;
    8. }
  • 可以指定底层类型。强类型枚举默认的底层类型为 int,但也可以显式地指定底层类型。

    1. enum class PUBLIC_COLOR: char { RED, GREEN, BLACK };
    2. enum PRIVATE_COLOR: int { RED, PURPLE, PINK };
    3. cout << sizeof(PUBLIC_COLOR::GREEN) << endl; // 1
    4. cout << sizeof(PRIVATE_COLOR::PURPLE) << endl; // 4
  • 不可能对不同的枚举类型的枚举值进行比较。但相同枚举值之间如果指定的值相同,那么可以进行比较。

    1. enum class PUBLIC_COLOR { RED, GREEN, BLACK };
    2. enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 };
    3. if (PUBLIC_COLOR::GREEN == PRIVATE_COLOR::PURPLE) { // errror
    4. cout << "PUBLIC_COLOR::GREEN == PRIVATE_COLOR::PURPLE" << endl;
    5. }
    6. if (PRIVATE_COLOR::PURPLE == PRIVATE_COLOR::PINK) { // ok
    7. cout << "PRIVATE_COLOR::PURPLE == PRIVATE_COLOR::PINK" << endl;
    8. }
  • 如果想要输出枚举值可以进行强制类型转换

    1. enum class PUBLIC_COLOR: char { RED, GREEN, BLACK };
    2. enum PRIVATE_COLOR: int { RED, PURPLE, PINK };
    3. cout << static_cast<int>(PUBLIC_COLOR::RED) << endl; // 0
    4. cout << static_cast<int>(PRIVATE_COLOR::PURPLE) << endl; // 1

原文链接:http://www.cnblogs.com/mrdragon/p/14450372.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号