C++11特性(9):强枚举类型enum
2018-03-24 21:25
621 查看
#include <iostream> namespace T //命名空间T { enum Color{ Black, Gray, Green }; } namespace S { enum Size{ Small = 1, Middle, Large }; } namespace //匿名命名空间(全局) { enum Color{Black,Blue,Gray}; } //枚举类:强类型枚举 int main() { //弱enum的缺点: //1、enum成员在函数内全局可见,所以下面第二行就会报错,提示重复定义 enum Type1{ Purple, Red, White }; enum Color{Purple,Gray,Green}; //Purple redefinition //具名namespace,class/struct及union必须未通过"名字::成员名"的方式访问,称为强作用域类型 //而enum则为非强作用域类型 //对于未使用名字,而直接使用enum的成员名的,默认进入全局命名空间 T::Color c = T::Green; if (c == Black) //Black是匿名命名空间的Black,而c为命名空间T内的Green,两者属于不同命名空间 std::cout << "..." << std::endl; //2、enum可以隐式转换为整型,导致不同类型的值可以相互比较 c = T::Gray; S::Size s = S::Small; if (c == s) std::cout << "match" << std::endl; //match //强枚举类型 enum class/struct //优点: //1、强作用域,强枚举类型成员的名称不会被输出到其父作用域空间 //2、转换限制,强枚举类型成员的值不可以与整型隐式地相互转换,可以使用显式地强制转换 //3、可以指定底层类型,强枚举类型默认底层类型为int,但也可以显式地指定底层类型 // 如:enum class Type : char{}; // 就指定了Type是基于char类型的枚举类型 enum class Type{ General, Light, Medium, Heavy }; enum class Color{ Black = 1, Red, Blue, Green }; //enum class Color中的Red和enum Type1中的Red不冲突,这是强枚举类型中强作用域的特点,强枚举类型的名字不会被输出到父作用域中 Type1 tt = Red; //ok,弱枚举类型的成员前可以不使用所属的枚举类型的名字 Color cl = Red; //error,强枚举类型的成员前必须使用所属的枚举类型的名字 Type t = Type::Light; Color clr = Color::Black; t = clr; //类型不匹配,编译失败 if (t == clr) //类型不匹配,编译失败 std::cout << "111" << std::endl; if (Type::Heavy > t) //编译通过 std::cout << "222" << std::endl; //222 if (t > 0) //不允许隐式转换为int类型,编译失败 std::cout << "333" << std::endl; if ((int)t > 0) //编译通过 std::cout << "444" << std::endl; //444 std::cout << std::is_pod<Type>::value << std::endl; //1 std::cout << std::is_pod<Color>::value << std::endl; //1 enum class C : char{ C1 = 1, C2 }; enum class D : unsigned{ D1 = 1, D2, Dbig = 0xFFFFFFFF0U }; std::cout << sizeof(C::C1) << std::endl; //1 std::cout << (unsigned)D::Dbig << std::endl; //4294967280 std::cout << sizeof(D::D1) << std::endl; //4 std::cout << sizeof(D::Dbig) << std::endl; //4 //C++11对原有的enum枚举类型进行扩展,即指定底层类型 enum Type2 : char{ CC1 = 1, CC2 }; return 0; }====================打个广告,欢迎关注====================
QQ: | 412425870 |
csdn博客: | http://blog.csdn.net/caychen |
码云: | https://gitee.com/caychen/ |
github: | https://github.com/caychen |
点击群号或者扫描二维码即可加入QQ群: 328243383(1群) | |
点击群号或者扫描二维码即可加入QQ群:180479701(2群) |
相关文章推荐
- java jdk1.5 特性 -- 枚举类型 Enum的使用与分析
- C++11新特性(三)Strongly-typed enums 强类型枚举简单使用
- 【C/C++】C++11新特性:std::bind
- C++11 新特性(2) 移动语义
- 开发中巧用Enum枚举类型
- c++11新特性--decltype
- 新手入门:C/C++中枚举类型(enum)
- C++11 新特性
- C++11中新特性之:unordered_map
- C++开发者都应该使用的10个C++11特性
- java 枚举类型 enum (示例程序)
- 【STL】C++11新特性emplace操作
- Android enum(枚举类型)使用详解
- Enum(枚举类型)的基本应用
- C++11特性运用--lambda表达式
- C++11新特性整理
- 【C++11新特性】 C++11智能指针之weak_ptr
- 【很nice的一篇文章】c++11特性与cocos2d-x 3.0之std::bind与std::function
- C++11新特性,实现用字符串作为switch的case子句
- java 枚举类型enum 的使用