您的位置:首页 > 编程语言 > C语言/C++

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群)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Cpp