C++11 强枚举类型
在标准C++11之前的枚举是继承C的,枚举类型不是类型安全的。枚举类型被视为整数,这使得两种不同的枚举类型之间可以进行比较。
一、C中enum类型的局限语法:
enum type1{a, b, c};
enum type2{a, d, e};
1、非强类型作用域
上面两种不同类型的枚举都含有a枚举常量,在相同作用域会发生冲突,编译会报错
2、允许编译器隐式类型转换
if(type1::a == type2::d){;}
两种不同enum常量比较没有实际意义,但是编译器是先将enum常量转换为int类型后,再比较的,不会报错。
3、占用存储空间极其符号不确定
enum type3{ a = , b = 0xFFFFFFFFFLL };
std::cout << sizeof(type3::a) << std::endl; //可能为8,视编译器而定,由其对齐字长决定的
std::cout << type3::b << std::endl; //输出大小不定,可能为0
问题来了,存储大小和符号都有未定的因素
二、C++11强枚举类型
语法:
enum struct|class name:type{a, b, c}; //class或struct完全等价,指定底层类型type
enum struct|class name{a, b, c}; //不指定底层类型,默认为int
特点及用法:
1、强作用域
type4 t = type4::a; //必须指定强类型名称
type4 p = a; //错误
2、不可隐式转换(可强转static_cast)
if(t < type4::b); //同一个enum类型可以比较
if(t > type5::b); //非同一个enum类型,不能隐式转换为int等值,不能比较
if((int)t > (int)type5::b) //强制类型转换,可以通过
3、可以指定底层类型
enum class type6:char{a=, b=};
enum class type7:unsigned int{a=0xFFFFFFFF};
既可以节省空间,又可以指定符号
4.C++11是兼容并拓展了C enum类型的
enum type8:char{a=, b=};
type8 t =a;
示例代码:
#include <iostream> // enum that takes 16 bits
enum smallenum: int16_t
{
a,
b,
c
}; // color may be red (value 0), yellow (value 1), green (value 20), or blue (value 21)
enum color
{
red,
yellow,
green = ,
blue
}; // altitude may be altitude::high or altitude::low
enum class altitude: char
{
high='h',
low='l', // C++11 allows the extra comma
}; // the constant d is 0, the constant e is 1, the constant f is 3
enum
{
d,
e,
f = e +
}; //enumeration types (both scoped and unscoped) can have overloaded operators
std::ostream& operator<<(std::ostream& os, color c)
{
switch(c)
{
case red : os << "red"; break;
case yellow: os << "yellow"; break;
case green : os << "green"; break;
case blue : os << "blue"; break;
default : os.setstate(std::ios_base::failbit);
}
return os;
} std::ostream& operator<<(std::ostream& os, altitude al)
{
return os << static_cast<char>(al);
} int main()
{
color col = red;
altitude a;
a = altitude::low; std::cout << "col = " << col << '\n'
<< "a = " << a << '\n'
<< "f = " << f << '\n';
}
C++11 强枚举类型的更多相关文章
- C++枚举类型Enum及C++11强枚举类型用法
C++中的枚举类型常常和switch配合使用,这里用一个简单的switch控制键盘回调的代码片段来说明枚举的用法: //W A S D 前.后.左.右行走 enum Keydown{ Forward= ...
- C++中对C的扩展学习新增语法——强枚举
枚举类型 C++中对枚举的加强: 1.C++不允许非枚举值赋值给枚举类型,不允许其他枚举类型的值赋值给当前枚举类型,而C语言中是允许的. 2.枚举值具有外层作用域,容易造成名字冲突. 3.不同类型的枚 ...
- 5月11日 ArrayList集合复习、特殊集合、枚举类型
一.ArrayList集合复习 //定义 ArrayList al = new ArrayList(); //添加元素 al.Add(); //插入元素 al.Insert(,); //查看个数 in ...
- Java枚举类型的用法
JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 1.用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fia ...
- java6枚举类型
java.lang.Enum > 使用enum定义. 类如: public class EnumDemo { enum Edge { TOP, BOTTOM, LEFT, RIGHT//定义了一 ...
- 浅谈java中的枚举类型(转)
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...
- JavaScript学习笔记-实现枚举类型,扑克牌应用
//实现枚举类型,扑克牌应用 function creatEnum(p){ //构造函数 var Enumeration = function(){throw 'can not Ins ...
- C#之枚举类型
参考: http://www.cnblogs.com/an-wl/archive/2011/04/14/2015815.html 惯例先上MSDN: https://msdn.microsoft.co ...
- java 枚举类型分析
最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...
随机推荐
- stm32点亮LED 测试代码及目录结构
. main.c - 使用PB12, PB13, PB14, PB15, PB5, PB6, PB7 这七个PB口点亮LED. 注意PB3和PB4是特殊口, 直接调用无效. #include &quo ...
- 首次启动Kafka报Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
首次启动Kafka报错如下: 原因:内存不足,查看启动配置 调小一些:
- 多级菜单系统安装维护shell脚本实现企业级案例
演示效果: 1.一级菜单 2.二级菜单 3.执行操作 脚本参考: #!/bin/bash #author lic(oldboy linux student) #date 1304 DISK_NO=&q ...
- Linux安装ElasticSearch-2.2.0-分词器插件(Mmseg)
1.在gitpub上搜索elasticsearch-analysis,能够看到所有elasticsearch的分词器: 2.安装Mmseg分词器:https://github.com/medcl/el ...
- UIView的transform
iOS开发UIView的transform属性详解 本文主要是详解iOS开发UIView的transform属性 CGAffineTransform实际上是一个矩阵 | a, b, 0 | | c ...
- symbolicatecrash App Bug 分析工具
1.symbolicatecrash 简介 symbolicatecrash 是一个 Xcode 自带解析 iOS Crash 文件的工具. 其它下载地址 symbolicatecrash,密码:6p ...
- 一个web.Config或app.Config自定义段configSections的示例
一个web.Config或app.Config自定义段configSections的示例 越来越觉得,直接用配置文件app.Config或web.Config配置应用系统的运行参数,比自己做一个xml ...
- U811.1接口EAI系列之二--生成销售出库单调用U8的EAI通用处理方法--PowerBuilder语言
1.销售系统销售出库,更新U811.1材料库存的EAI的XML生成. 2.主要根据U8配置会生成出库单和同时是否更新库存量,还是更新现存量等等. 3.具体参考代码如下: 作者:王春天 2013-11- ...
- unity, 在材质上指定render queue
材质球inspector面板在debug模式下可以看到Custom Render Queue一项: 其默认值为-1,表示使用相应shader的render queue设置. 也可以人为将其改为其它值, ...
- Windows 计划任务 Task Schedule 怎么 运行 .bat文件
1. 新建 test.bat 需要切换文件夹以后 并且执行程序. cd /D "F:\xxxfolder" && dotnet testdll.dll 2. 直接设 ...