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

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 19 特殊工具与技术)枚举类型相关的知识,希望对你有一定的参考价值。

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 特殊工具与技术)枚举类型的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针