C++11特性(9):强枚举类型enum

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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值