关于网站建设的投标书网站如何推广
C++初学者指南第一步—6.枚举和枚举类
文章目录
- C++初学者指南第一步---6.枚举和枚举类
 - 1.作用域的枚举(enum class类型)(C++11)
 - 2.无作用域的枚举(enum类型)
 - 3.枚举类的基础类型
 - 4.自定义枚举类映射
 - 5.和基础类型的互相转换
 
1.作用域的枚举(enum class类型)(C++11)
语法:
enum class name { enumerator1, enumerator2, … enumeratorN };
 
默认值:每个枚举类映射到从 0 到 N-1 的整数
enum class day { mon, tue, wed, thu, fri, sat, sun };
day d = day::mon;      
d = day::tue;  // OK
d = wed;  // Err! 编译错误: 'wed' 只能在day作用域内
 
- 仅限于命名范围的枚举类
 - 无法像某些其他语言那样查询枚举的属性
 
2.无作用域的枚举(enum类型)
语法:
enum name { enumerator1, enumerator2, … enumeratorN };
 
注意缺少关键字“class”。
enum day { mon, tue, wed, thu, fri, sat, sun };
day d = mon;  // OK!, 枚举值 "mon" 没有作用域
int i = wed;  // OK!, i = 2
enum stars { sun, … };  // Err! 编译错误:名称冲突
 
- 不局限于作用域的枚举⇒名称冲突
 - 危险的隐式转换为基础类型
 - 无法像某些其他语言那样查询枚举的属性
 
注意一下enum class和enum类型的区别,enum枚举类型从C语言开始就有了,C++中也继承了这一类型,那为什么还要增加enum class呢,主要有以下几个原因:
- 类型安全性:
enum class 是一种强类型枚举(strongly typed enum)。它拥有更好的类型安全性,因为它的枚举值是被限定在枚举类型内部的。
传统的 enum 是一种弱类型枚举(weakly typed enum)。它的枚举值可以隐式地转换为整型,容易造成意外的转换和错误。 - 命名空间:
enum class 的枚举值是限定在该枚举类型的命名空间中的。要访问枚举值需要使用 EnumName::ValueName 的形式。
enum 的枚举值直接存在于全局命名空间中,可以直接使用 ValueName 的形式访问。 - 默认基础类型:
enum class 的默认基础类型是 int。但可以使用 enum class EnumName : underlying_type; 的形式指定其他整数类型作为基础类型。
enum 的默认基础类型也是 int,但不能直接指定其他基础类型。 - 作用域:
enum class 的作用域仅限于该枚举类型本身。
enum 的作用域会"污染"全局命名空间。 
注意:避免使用无限定作用域的枚举
3.枚举类的基础类型
- 必须是整数类型(char、short、long、…)
 - 默认是int型
 
// 7个值 ⇒ char类型应该足够了
enum class day : char {mon, tue, wed, thu, fri, sat, sun
};
// 不超过10,000 ⇒ short类型应该足够了
enum class language_ISO639 : short {abk, aar, afr, aka, amh, ara, arg, …
};
 
4.自定义枚举类映射
- 可以显式设置枚举类值
 - 不需要以 0 开头
 - 某些值可以省略
 - 可以是部分的(只有一些具有枚举值的枚举器)
 
注意:如果显式设置枚举类的枚举值,请对所有枚举类的枚举执行此操作
enum class month {jan = 1, feb = 2, mar = 3, apr = 4,  may = 5,  jun = 6,  jul = 7, aug = 8, sep = 9, oct = 10, nov = 11, dec = 12 
};
enum class flag {A = 2, B = 8, C = 5, D, E, F = 25
};
 
5.和基础类型的互相转换
enum class month {jan = 1, feb = 2, mar = 3, apr = 4,  may = 5,  jun = 6,  jul = 7, aug = 8, sep = 9, oct = 10, nov = 11, dec = 12 
};
 
| 枚举 → 整数 | 整数→枚举 | 
| int i = static_cast(month::mar);  // i: 3  | int i = 0; cin >> i; // 确定 i ≥ 1 and ≤ 12 … month m1 = static_cast(i);  | 
附上原文链接
 如果文章对您有用,请随手点个赞,谢谢 ^_^ !
 不来张图片就文章标题就很丑!
 
