1. 枚举类型(enumeration)

将一组整型常量组织在一起。

1.1 限定作用域 的 枚 举 类 型( scoped enumeration)

  • 关 键 字 enum class ( enum struct)
  • 枚举成员列表( enumerator)

eg.

enum class open_modes
{input, output, append
};

1.2 不限定作用域的枚举类型( unscoped enumeration)

省略掉关键字 class

eg.
enum color { red, yellow, green };// 未命名的、 不限定作用域的枚举类型
enum { floatPrec = 6, doublePrec = 10, double_doublePrec = 10 };

1.3 枚举成员

在限定作用域的枚举类型中, 枚举成员的名字遵循常规的作用域准则, 并且在枚举类型的作用域外是不可访问的

enum color { red, yellow, green }; // 不限定作用域的枚举类型
enum stoplight {red, yellow, green };//错误: 重复定义了枚举成员
enum class peppers { red, yellow, green }; / / 正确: 牧举成员被隐藏了color eyes = green; // 正确: 不限定作用域的枚举类型的枚举成员位于有效的作用域中
peppers p = green;//错误: peppers 的枚举成员不在有效的作用城中,  color::green 在有效的作用域中, 但是类型错误color hair = color::red;/ / 正确: 允许显式地访问枚举成员
peppers p2 = peppers::red;/ / 正确: 使用 pappers 的 red

1.4 默认情况下, 枚举值从 o 开始, 依次加 1 ,不过我们也能为一个或几个枚举成员指定专门的值

enumclass mtTypes {charTyp = 8,shortTyp = 16, intTyp = 16,longTyp = 32, long longTyp = 64
}

1.5 定义并初始化enum成员。

  • 初始化一个enum对象赋值, 必须使用该类型的一个枚举成员或者该类型的另一个对象
open_modes om = 2; / / 错误: 2 不属于类型 open_modes
om = open_modes::input;/ / 正确: input 是 open_modes 的一个枚举成员
  • 每个枚举成员本身就是一条常量表达式,可以在任何需要常量表达式的地方使用枚举成员。
eg. 可以定义枚举类型的 constexpr 变量:
constexpr intTypes charbits = intTypes::charTyp;

1.6 转换成整型

一个不限定作用域的枚举类型的对象或枚举成员自动地转换成整型

int i = color::red; // 正确: 不限定作用域的枚举类型的枚举成员隐式地转换成 int
int j = peppers::red;/ / 错误: 限定作用域的枚举类型不会进行隐式转换

1.7 指定 enum 的大小

尽管每个 enum 都定义了唯一的类型, enum 是由某种整数类型表示的。默认为int,也可以自己指定。

enum int Values : unsigned long long {charTyp = 255, shortTyp = 65535,intTyp = 65535,longTyp = 4294967295UL,long_longTyp = 18446744073709551615ULL
}

1.8 枚举类型的前置声明

  • 不限定作用域的 enum 未指定成员的默认大小, 因此每个声明必须指定成员的大小。
  • 限定作用域的 enum 可以不指定其成员的大小, 这个值被隐式地定义成 int
//不限定作用域的枚举类型 intValues 的前置声明
enum intValues : unsigned long long; // 不限定作用域的, 必须指定成员类型
enum class open_modes; / / 限定作用域的枚举类型可以使用默认成员类型 int

1.9 声明和定义必须匹配

// 错误: 所有的声明和定义必须对该 enum 是限定作用域的还是不限定作用域的保持一致
enum class intValues;
enum intValues;  / / 错误: intValues 已经被声明成限定作用域的
enum intValues : long; // 错误: intValues 已经被声明成 int

1.10 形参匹配与枚举类型

//不限定作用域的枚举类型. 潜在类型因机器而异
enum Tokens { INLINE = 128, VIRTUAL = 129 };
void ff(Tokens);
void ff(int);int main ( ) {Tokens curTok = INLINE;ff (128); //精确匹配ff(int)ff (INLINE);//精确匹配ff(Tokens)ff (curTok);//精确匹配ff(Tokens)return 0;
}

尽管我们不能直接将整型值传给enum形参, 但是可以将一个不限定作用域的枚举类型的对象或枚举成员传给整型形参。 此时,enum的值提升成 int 或更大的整型, 实际提升的结果由枚举类型的潜在类型决定:

void newf (unsigned char);
void newf (int);
unsigned char uc = VIRTUAL;
newf(VIRTUAL);//调用newf(int)
newf(uc);// 调用newf(unsigned char)

C++ Primer 5th笔记(chap 19 特殊工具与技术)枚举类型相关推荐

  1. C++ Primer 5th笔记(chap 19 特殊工具与技术)异常类层次

    1. 类 exception . bad_cast 和 bad_alloc 定 义 了 默 认 构 造 函 数 runtime_error 和 logic_error没有默认构造函数, 但是有一个可以 ...

  2. C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid运算符

    1. typeid运算符(typeid operator) 它允许程序向表达式提问:你的对象是什么类型? typeid表达式的形式是typeid(e),其中e可以是任意表达式或类型的名字,它操作的结果 ...

  3. C++ Primer 5th笔记(chap 19 特殊工具与技术)运行时类型识別RTTI

    1. 运行时类型识别(run-time type identification ) 当我们将这两个运算符用于某种类型的指针或引用, 并且该类型含有虚函数时, 运算符将 使用指针或引用所绑定对象的动态类 ...

  4. C++ Primer 5th笔记(chap 19 特殊工具与技术)type_info 类

    1. type_info 的操作 操作 描述 t1 == t2 如果type_info对象t1和t2表示同一种类型,则返回true t1 != t2 如果type_info对象t1和t2表示不同的类型 ...

  5. C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid

    1. 通常情况下使用 typeid 比较两条表达式的类型是否相同或者比较一条表达式的类型是否与指定的类型相同 Derived *dp = new Derived; Base *bp = dp; // ...

  6. C++ Primer 5th笔记(chap 19 特殊工具与技术)使用 RTTI

    1. RTTI用处 当想为具有继承关系的类实现相等运算符时.对于两个对象来说,如果他们的类型相同并且对应的数据成员取值相同,则我们说这两个类是相等的. class Base {friend bool ...

  7. C++ Primer 5th笔记(chap 19 特殊工具与技术)定位 new 表达式

    1. 定位 new (placement new) 1.1 起因 内存分配和初始化分离开 Placement new allows you to construct an object in memo ...

  8. C++ Primer 5th笔记(chap 19 特殊工具与技术)malloc 函数与 free 函数

    void *operator new (size_t size) {if (void *mem = malloc (size) )return mem;elsethrow bad_alloc ( ); ...

  9. C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配

    1. new void operator new (size_t, void ) ;//不允许重新定义这个版本 string *sp = new string("a value") ...

  10. C++ Primer 5th笔记(chap 19 特殊工具与技术)链接指示: extern “C“

    1. C++程序有时需要调用其他语言编写的函数, C++使用链接指示( linkage directive)指出任意非 C++函数所用的语言 1.1 声明一个非C++函数 // 可能出现在 C++头文 ...

最新文章

  1. 【oracle】补充 cursor 基本例子
  2. 如何轻松学习 Kubernetes?
  3. springboot通过接口访问html,springboot不通过controller直接访问静态html
  4. scala数据结构之Maps和Tuples
  5. .NET点滴:SpanT
  6. 为文档快速插入页眉和页脚
  7. Windows Home Server 常见问题
  8. PMP考试的一点学习感悟
  9. pathseparator_Java文件分隔符,separatorChar,pathSeparator,pathSeparatorChar
  10. 计算机应用网络工程师的英文名字,网络工程师英文简历
  11. Matlab遗传算法
  12. java中this关键字的作用
  13. 树莓派python蓝牙_在树莓派3B上做蓝牙音频
  14. SystemTap----利用stap命令来查找内核函数定义
  15. php移除excel密码,excel保护密码忘记怎么撤销保护工作表
  16. contiki之list(1)
  17. 教你如何让windows系统的C盘空间变富裕,永远都不会用完。
  18. 用 OpenCV 检测图像中各物体大小
  19. hadoop slaves
  20. 微信运动刷步数html前端源码,悦动圈步数提交协议漏洞分析实现微信运动刷步数...

热门文章

  1. C++:const分配内存情况分析
  2. Java 什么叫做实例化
  3. 用力和应变片计算弹性模量_一种沿深度非均匀分布的残余应力测试计算方法与流程...
  4. 语言学生学籍管理系统流程图_基于C语言的学生管理系统(含文件)(一)
  5. 锂电系统上位—数据中心更高效率运营
  6. 成功解决ImportError: Missing optional dependency ‘fastparquet‘. fastparquet is required for parquet supp
  7. MAT之GUI:GUI的方式创建/训练/仿真/预测神经网络
  8. Python IDE之Pydev: 基于Eclipse搭建python的编译环境(Eclipse+pydev)简介、安装、使用的详细攻略
  9. Ubuntu16.04 Docker 安装
  10. python库学习笔记——分组计算利器:pandas中的groupby技术