C++11 强类型枚举相关总结

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

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;
}

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

  • 枚举中的成员被设计为常量数字的别名,因此可以隐式的转换为 int 类型,但是这在某些时候是不被期望出现的。
  • 枚举类型锁占用的空间大小以及符号不确定。

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

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

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

  • 强作用域,强类型枚举成员的名称不会被输出到其父作用域空间。
enum class PUBLIC_COLOR { RED, GREEN, BLACK }; // ok
enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 }; // ok
  • 转换限制,强类型枚举成员的值不可以与整形隐式地相互转换。
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

以上就是C++11 强类型枚举相关总结的详细内容,更多关于C++11 强类型枚举的资料请关注我们其它相关文章!

(0)

相关推荐

  • C++基础入门教程(四):枚举和指针

    我已经把<C++ Primer>一书准备好了,如果这本<C++ Primer Plus>继续这么瞎闹的话,我就换主角~! 没错,这书连if while都还没介绍呢,就开始把指针搬出来了,虽然只是简单介绍.. 这目录编排我也是醒了. 那么,按照书上的进度,今天来初步说说指针. 但,今天周五,你懂的,就随便水一下,因为我怕到周一又忘了. 1.枚举 那么,枚举是什么呢?(小若:等等~!说好的指针呢?) 大部分高级语言里应该都有枚举了,所以也没什么好介绍的. 使用是这样的: 复制代码 代码

  • 结合C++11的新特性来解析C++中的枚举与联合

    枚举 枚举是用户定义的类型,其中包含一组称为枚举器的命名的整型常数. 语法 // unscoped enum: enum [identifier] [: type] {enum-list}; // scoped enum: enum [class|struct] [identifier] [: type] {enum-list}; // Forward declaration of enumerations (C++11): enum A : int; // non-scoped enum mu

  • 讲解C++中的枚举类型以及声明新类型的方法

    C++枚举类型 如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型.所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内.声明枚举类型用enum开头.例如: enum weekday{sun, mon, tue, wed, thu, fri, sat}; 上面声明了一个枚举类型weekday,花括号中sun, mon, -, sat等称为枚举元素或枚举常量.表示这个类型的变量的值只能是以上7个值之一.它们是用户自己定义的标识符. 声明枚举类

  • 详解C++11强类型枚举

    1.传统枚举类型的缺陷 枚举类型是C/C++中用户自定义的构造类型,它是由用户定义的若干枚举常量的集合.枚举值对应整型数值,默认从0开始.比如定义一个描述性别的枚举类型. enum Gender{Male,Female}; 其中枚举值Male被编译器默认赋值为0,Female赋值为1.传统枚举类型在设计上会存在以下几个问题. (1)同作用域同名枚举值会报重定义错误.传统C++中枚举常量被暴漏在同一层作用域中,如果同一作用域下有两个不同的枚举类型,但含有同名的枚举常量也是会报编译错误的,比如: e

  • C和C++11之enum枚举的具体使用方法

    一.前言 由于C++项目中用了相对比较多的枚举(enum),正常情况下,枚举变量都是占用一个整形类型的大小,但是项目中枚举(enum)只需要使用到一个字节的大小,因为是在嵌入式设备上执行的代码,资源比较少,那么如果枚举都是按照int型大小来使用的话,这无疑是一种资源浪费. 所以就想有没有一种办法可以控制枚举(enum)占用内存的办法.所幸,通过查找资料,发现C++11的新特性刚好加入了控制枚举大小的机制.那么接下来我们就来看看,枚举(enum)在C++11标准有哪些变化?以及C和C++11中的枚

  • C++小知识:尽可能使用枚举类

    静态代码分析工具可简化编码过程,检测出错误并帮助修复.PVS-Studio 是一个用于 C/C++ 的静态代码分析工具.该团队检测了 200 多个 C/C++ 开源项目,包括了 Unreal Engine.Php.Haiku.Qt 和 Linux 内核等知名项目. 下面这个 Bug 是在 Source SDK 的源代码中发现的. 错误代码: 这种错误的例子代码量都非常大,我尽可能地选取其中最小的一部分,但是很抱歉,代码看起来依旧很冗长. enum PhysGunPickup_t { PICKED

  • C++枚举类型enum与enum class的使用

    一.关于枚举类型 1. 什么是枚举类型? 答:如果一个变量只有几种可能的值,那么就可以定义为枚举类型,比如:性别只有男和女,那么就可以将性别定义为一种枚举类型,其中男和女就是性别所包含的变量.所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内.在C++中,枚举类型分为不限定作用域(enum)和限定作用域(enum class). 2. enum与enum class的区别? (为什么需要限定作用域?) 答:枚举作用域是指枚举类型成员名字的作用域,起自其声明之处,

  • C++枚举类型用法总结(枚举字符常量代替常量)

    C++枚举类型enum表示枚举,通常用于定义个新类型的字符常量,比如enum {January,February,March}.枚举类型的作用域一般是整个文件或者类内.当枚举类型定义在文件开头时,则作用域是从定义位置开始往后(不包括函数内定义):当枚举类型在类内定义时,则作用域为整个类内.在类内的头文件定义和初始化枚举类型,当实例这个类的对象时,枚举类型不会占用空间,只是包含一个字符常量而已. 枚举类型的定义可以在整个文件夹,也可以在类内.当在整个文件夹时,所有枚举量不能有相同的.当在类内时,不

  • C++11 强类型枚举相关总结

    枚举就是定义一个类别,并且穷举统一类别下的个体以供代码使用. C++98 枚举存在的缺陷: 无论是具名枚举的名字还是枚举类型中的成员,都是全局范围的,其作用域是全局的. 如果在不同的枚举中定义了相同的枚举成员,则会出现重复声明(redeclaration)错误. enum PUBLIC_COLOR { RED, YELLOW, GREEN }; enum PRIVATE_COLOR { RED, BLACK, PURPLE }; // RED 重定义 enum PUBLIC_COLOR { WH

  • c++11 实现枚举值到枚举名的转换问题

    目录 效果 关键技术 __VA_ARGS__ #__VA_ARGS__ 在函数外执行代码的能力 模板函数的静态变量 关键代码 源码地址 效果 ENUM_DEFINE ( Color, Red, Blue, ) EnumHelper(Color::Red) -> "Red" EnumHelper(Color::Red, std::toupper) -> "RED" 关键技术 __VA_ARGS__ __VA_ARGS__ 实现了可变参数的宏. #defin

  • JAVA 枚举相关知识汇总

    Java 枚举 知识点 概念 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum 关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, GREEN, BLUE } 如果枚举不添加任何方法,枚举值默认为从0开始的有序数值.以 Color 枚举类型举例,它的枚举常量依次为 RED:0,GREEN:1,BLUE:2. 枚举的好处:可以将常量组织起来,统一进行管理. 枚举的典型应用场景:错误码.状态机等. 枚举类型的本质

  • 关于C++11中限定作用域的枚举类型的问题

    枚举类型是将一组有限的整数常量组织在一起用以描述变量可取值范围的一种数据类型.C++中有两种类型的枚举:不限定作用域的枚举类型和限定作用域的枚举类型.限定作用域的枚举类型是C++11标准引入的新类型. ● 限定作用域枚举类型是为了弥补不限定作用域枚举类型的不足而出现的,不限定作用域的枚举类型不是类型安全的,主要表现在如下几个方面: ● 不限定作用域的枚举类型中的枚举成员被视为整数,两种不同的枚举类型之间可以进行比较.两种不同类型的数据进行比较,可能带来数据类型转换,引起数据表示不完整. ● 不限

  • C++第11版本中的一些强大的新特性小结

    Auto Type Deduction 自动类型推导 auto 关键字让用户得以使用 C++ 内置的类型推导特性. std::string something = somethingthatreturnsastring.getString(); auto something = somethingthatreturnsastring.getString(); Auto 关键字会对上述自变量(something)进行自动推导,得出其应该是 string 类型的结论,并在 auto 出现的地方用正确

  • Swift 3.0基础学习之枚举类型

    枚举语法 使用关键字 enum 定义一个枚举 enum SomeEnumeration { // enumeration definition goes here } 例如,指南针有四个方向: enum CompassPoint { case north case south case east case west } 这里跟 c 和 objective-c 不一样的是,Swift 的枚举成员在创建的时候没有给予默认的整型值.所以上面代码中的东南西北并不是0到3,相反,不同的枚举类型本身就是完全

随机推荐