C++11 强类型枚举

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

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

  • 不管是具名枚举的名字仍是枚举类型中的成员,都是全局范围的,其做用域是全局的。 若是在不一样的枚举中定义了相同的枚举成员,则会出现重复声明(redeclaration)错误。设计

    enum PUBLIC_COLOR { RED, YELLOW, GREEN };
    enum PRIVATE_COLOR { RED, BLACK, PURPLE };      // RED 重定义
    enum PUBLIC_COLOR { WHITE, GRAY };				// PUBLIC_COLOR 重定义
    
    int main() {
        int color = RED;
    
        cout << color << endl;
    }

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

  • 枚举中的成员被设计为常量数字的别名,所以能够隐式的转换为 int 类型,可是这在某些时候是不被指望出现的。作用域

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

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

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

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

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

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

    enum class PUBLIC_COLOR { RED, GREEN, BLACK };
    enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 };
    
    if (PUBLIC_COLOR::GREEN == 1) {     // errror: 未定义可接受的类型转换
        cout << "color1 == 1" << endl;
    }
    
    if (PRIVATE_COLOR::PURPLE == 1) {   // ok
        cout << "color2 == 1" << endl;
    }
  • 能够指定底层类型。强类型枚举默认的底层类型为 int,但也能够显式地指定底层类型。命名空间

    enum class PUBLIC_COLOR: char { RED, GREEN, BLACK };
    enum PRIVATE_COLOR: int { RED, PURPLE, PINK };
    
    cout << sizeof(PUBLIC_COLOR::GREEN) << endl;		// 1
    cout << sizeof(PRIVATE_COLOR::PURPLE) << endl;		// 4
  • 不可能对不一样的枚举类型的枚举值进行比较。但相同枚举值之间若是指定的值相同,那么能够进行比较。语法

    enum class PUBLIC_COLOR { RED, GREEN, BLACK };
    enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 };
    
    if (PUBLIC_COLOR::GREEN == PRIVATE_COLOR::PURPLE) {     // errror
        cout << "PUBLIC_COLOR::GREEN == PRIVATE_COLOR::PURPLE" << endl;
    }
    
    if (PRIVATE_COLOR::PURPLE == PRIVATE_COLOR::PINK) {     // ok
        cout << "PRIVATE_COLOR::PURPLE == PRIVATE_COLOR::PINK" << endl;
    }
  • 若是想要输出枚举值能够进行强制类型转换方法

    enum class PUBLIC_COLOR: char { RED, GREEN, BLACK };
    enum PRIVATE_COLOR: int { RED, PURPLE, PINK };
    
    cout << static_cast<int>(PUBLIC_COLOR::RED) << endl;		// 0
    cout << static_cast<int>(PRIVATE_COLOR::PURPLE) << endl;	// 1
相关文章
相关标签/搜索