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

    1. 枚举:分本别类和数值的名字

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

    (1)宏

    #define Male 0

    #define Female 1

    (2)匿名的enum

    enum { Male, Female };

    (3)静态常量

    const static int Male = 0;

    const static int Female = 1;

    2. 有缺陷的枚举

    具名的enum类型的名字以及enum的成员的名字都是全局可见的。

    以下会出错:

    #include <iostream>
    using namespace std;
    
    namespace T {
      enum TYPE { General, Light, Medium, Heavy };
    }
    
    namespace {
      enum Category { General = 1, Pistol, MachineGun, Cannon };
    }
    
    int main() {
      T::Type t = T::light;
      if (t == General)  //忘记使用namespace
        cout << "General Weapon" << endl;
    
      return 0;
    }

    另外,C++中枚举被设计为常量数值的“别名”的本性,所以枚举的成员总是可以被隐式地转换为整形。

    枚举类型所占用的空间大小也是一个不确定量。

    3. 强类型枚举以及c++11对原有枚举类型的扩展

    声明强类型枚举,只需要在enum加上关键字class。

    enum class Type { General, Light, Medium, Heavy };

    优点:

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

    (2)转换限制,强类型枚举成员的值不可以与整形隐式地相互转换

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

    比如:

    enum class Type: char { General, Light, Medium, Heavy };

    #include <iostream>
    using namespace std;
    
    enum class Type { General, Light, Medium, Heavy };
    enum class Category { General = 1, Pistol, MachineGun, Cannon };
    
    int main() {
      Type t = Type::Light;
      t = General;  //编译失败,必须使用强类型名称
    
      if (t == Category::General) //编译失败,必须使用Type中的General
        cout << "General Weapon" << endl;
      if (t > Type::General) //通过编译
        cout << "Not General Weapon" << endl;
      if (t > 0)  //编译失败,无法转换为int类型
        cout << "Not General Weapon" << endl;
      if ((int)t > 0)  //通过编译
        cout << "Not General Weapon" << endl;
    
      return 0;
    }
  • 相关阅读:
    poj 3264(RMQ或者线段树)
    LCA上的RMQ模板算法
    LCA离线算法Tarjan的模板
    poj 1330(初探LCA)
    hdu 3367(与最大生成树无关。无关。无关。重要的事情说三遍+kruskal变形)
    hdu 4496(并查集逆向添边)
    hdu 1829(继续扩展并查集)
    poj 1182 (扩展并查集)
    hdu 3038(扩展并查集)
    hdu 3371(kruskal)
  • 原文地址:https://www.cnblogs.com/sssblog/p/11434351.html
Copyright © 2011-2022 走看看