C++11之array数组基础学习
[TOC]
文章转自:https://www.runoob.com/w3cnote/cpp-enums-intro-and-strongly-typed.html
文章参考:https://www.yisu.com/zixun/311515.html
概述
众所周知,C/C++ 语言可以使用 #define 和 const 创建符号常量,而使用 enum 工具不仅能够创建符号常量,还能定义新的数据类型,但是必须按照一定的规则进行,下面我们一起看下 enum 的使用方法。
枚举类型(enumeration)使我们可以将一组整型常量组织在一起。和类一样,每个枚举类型定义了一种新的类型。枚举属于字面值常量类型。
C++包含两种枚举:限定作用域的和不限定作用域的。这里主要介绍限定作用域的。不限定作用域的使用可以参考: http://blog.csdn.net/fengbingchun/article/details/51778977 。
枚举量的声明和定义
(1) 首先,请看下面的语句:
1 | enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}; |
这句话有两个作用:
- 第一:声明 enumType 为新的数据类型,称为枚举(enumeration);
- 第二:声明 Monday、Tuesday 等为符号常量,通常称之为枚举量,其值默认分别为 0-6。(后面会介绍怎样显式的初始化枚举量的值)
(2) 接着利用新的枚举类型 enumType 声明这种类型的变量:enumType Weekday 就像使用基本变量类型int声明变量一样,如 int a; 也可以在定义枚举类型时定义枚举变量
1 | enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}Weekday; |
然而与基本变量类型不同的地方是,在不进行强制转换的前提下,只能将定义的枚举量赋值给该种枚举的变量,如:Weekday = Monday; 或者 Weekday = Sunday; 不能将其他值赋给枚举变量,如:Weekday = 10; 这是不允许的,因为 10 不是枚举量。也就是说 Weekday 只能是定义的 Monday-Sunday 这些定义过的枚举量。然而这不是绝对的,第六条会讲到利用强制类型转换将其他类型值赋给枚举变量。
(3) 上面讲不能将非枚举量赋给枚举变量,那么能不能将枚举量赋给非枚举变量呢?如:int a=Monday; 这是允许的,因为枚举量是符号常量,这里的赋值编译器会自动把枚举量转换为int类型。
(4) 前面讲可以对枚举进行赋值运算,那枚举变量能不能进行算术运算呢?
1 | Weekday++;Weekday = Monday + Tuesday; |
这是非法的,因为这些操作可能导致违反类型限制,比如:
1 | Weekday = Sunday; |
Weekday 首先被赋予枚举量中的最后一个值 Sunday(值为6),再进行递增的话,Weekday 增加到 7,而对于 enumType 类型来说,7 是无效的。
总结:对于枚举,只定义了赋值运算符,没有为枚举定义算术运算。
**(5)**不能对枚举量进行算术运算,那么枚举量能不能参与其他类型变量的运算呢?
1 | int a; |
这是允许的,因为编译器会自动把枚举量转换为 int 类型。
**(6)**第二条讲:在不进行强制转换的前提下,只能将定义的枚举量赋值给该种枚举的变量,言下之意就是可以通过强制转换将其他类型值赋给枚举变量:
1 | Weekday = enumType(2); |
等同于:
1 | Weekday = Wednesday; |
但是,如果试图将一个超出枚举取值范围的值通过强制转换赋给枚举变量,会出现什么结果?
1 | Weekday = enumType(20); |
结果将是不确定的,这么做不会出错,但得不到想要的结果。
自定义枚举量的值
(1) 前面讲通过定义 enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}; 枚举量 Monday、Tuesday 等的值默认分别为 0-6,我们可以显式的设置枚举量的值:
1 | enum enumType {Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7}; |
指定的值必须是整数!
(2) 也可以只显式的定义一部分枚举量的值:
1 | enum enumType {Monday=1, Tuesday, Wednesday=1, Thursday, Friday, Saturday, Sunday}; |
这样 Monday、Wednesday 均被定义为 1,则 Tuesday=2,Thursday、Friday、Saturday、Sunday 的值默认分别为 2、3、4、5。
总结:未被初始化的枚举值的值默认将比其前面的枚举值大1。
(3) 第二条还说明另外一个现象,就是枚举量的值可以相同。
枚举的取值范围
枚举类型
C++11新标准引入了限定作用域的枚举类型(scoped enumeration)。定义限定作用域的枚举类型的一般形式是:首先是关键字enum class(或者等价地使用enum struct),随后是枚举类型名字以及用花括号括起来的以逗号分隔的枚举成员(enumerator)列表,最后是一个分号。
枚举作用域(enumeration scope)是指枚举类型的成员的名字的作用域,起自其声明之处,终止枚举定义结束之处。C语言规定,枚举类型的成员(enumerator)的可见范围被提升至该枚举类型所在的作用域内。这被认为有可能污染了外部的作用域,为此,C++11引入了枚举类(enum class)解决此问题。
定义不限定作用域的枚举类型(unscoped enumeration)时省略掉关键字class(或struct),枚举类型的名字是可选的。