zoukankan      html  css  js  c++  java
  • C++11 强类型枚举

    【1】枚举:分门别类与数值的名字

    当程序中需要“数值的名字”时,通常有三种方式实现:

    (1)宏

    1 #define Male   (0)
    2 #define Female (1)

    缺点:如果代码中右Male或者Femal字符串,在预处理阶段一律替换,干扰正常代码。

    (2)匿名的enum

    enum { Male, Female };

    优点:a. 编译期检查;b. 相比于宏,不会干扰正常代码

    缺点:见下节

    (3)静态常量

    1 const static int Male = 0;
    2 const static int Female = 1;

    优点:a. 编译期检查;b. 作用域局限于文件内;

    缺点:相比于enum,编译器可能会为Male和Female在目标代码中产生实际的数据,会增加存储空间。

    【2】有缺陷的枚举类型

    旧版enum存在的问题:

    (1)向整型的隐式转换

    (2)无法指定底层所使用的数据类型

    (3)enum的作用域。比如无法定义同名的枚举成员

    (4)不同编译器解决该问题的方法不统一。削弱了可移植性。

    【3】强类型枚举

    强类型枚举特点:

    (1)声明方式。enum class 与 enum struct等价

    (2)强作用域。强类型枚举成员的名称不会被输出到其父作用域,所以不同枚举类型定义同名枚举成员编译不会出现重定义错误。

    同时使用枚举类型的枚举成员时,必须指明所属范围,单独的枚举成员名则不再具有意义。

    (3)限制转换。强类型枚举成员的值不可以与整型发生相互隐式转换。

    (4)可以指定底层类型。强类型枚举默认的底层类型是int,但也可以显式地指定底层类型。

    (5)不可声明匿名强类型枚举。由于强类型枚举是强类型作用域的,故匿名的enum class可能什么都做不了,匿名强类型枚举会编译报错。

    示例如下:

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 #include <map>
     5 using namespace std;
     6 
     7 // C++11引入了一种新的枚举类型,即“枚举类”,又称“强类型枚举”。声明请类型枚举非常简单,只需要在enum后加上使用class或struct。
     8 enum Old { Yes, No };         // old style
     9 enum class New1 { Yes, No };  // new style
    10 enum struct New2 { Yes, No }; // new style
    11 
    12 int main()
    13 {
    14     /**
    15     *“传统”的C++枚举类型有一些缺点:
    16     */
    17     enum Status1 { Ok, Error };
    18 //  enum Status2{Ok, Error};     // error:导致命名冲突, Status1已经有成员叫Ok, Error
    19 
    20     // 在C++11中,强类型枚举解决了这些问题
    21     enum class StatusN1 { Ok, Error };
    22     enum struct StatusN2 { Ok, Error };
    23 //    enum class { Wang, Liu, Sun, Zhao }; // error:匿名强类型枚举编译报错
    24 
    25 //  StatusN1 flagN1 = Ok;         // error:必须使用强类型名称
    26     StatusN2 flagN2 = StatusN2::Ok;
    27 
    28     enum class C : char { C1 = 1, C2 = 2 }; // 指定枚举的底层数据类型char
    29     enum class D : unsigned int { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U };
    30     cout << sizeof(C::C1) << endl;    // 1
    31     cout << sizeof(D::E1) << endl;    // 4
    32     cout << sizeof(D::Ebig) << endl;  // 4
    33 
    34     system("pause");
    35 }

    如上所述。

    【4】原枚举类型的扩展

    C++11对传统枚举类型进行了扩展:

    (1)可指定底层基本类型。如请类型枚举,应用比如:

    enum Type : char { Low, Middle, High };

    (2)从C++11后,枚举类型的成员可以在枚举类型的作用域内有效。比如:

    1 enum Type { Low, Middle, High };
    2 Type type1 = Middle;
    3 Type type2 = Type::Middle;

    其中Middle与Type::Middle都是合法的使用形式。

    good good study, day day up.

    顺序 选择 循环 总结

  • 相关阅读:
    range用法(倒序取值)
    set操作
    map集合 可变对象
    元组
    list操作
    列表推导式、字典推导式、集合推导式
    调用父类方法
    谷歌浏览器真机调试的方法
    css3 flex弹性盒自动铺满写法
    微信小程序保存海报的方法
  • 原文地址:https://www.cnblogs.com/Braveliu/p/12246219.html
Copyright © 2011-2022 走看看