C++之枚举类型探索


一、enum初识(作用)

enum的全称是enumeration意思是列举,可以用一些符号表示一组属性值,也就是将数字符号化,因为数字表面看不出任何意义,可读性很差。

例如,在贪吃蛇游戏中表示地图信息 enum MapInfo { GROUND , SNAKEHEAD ,SNAKEBODY } ;

相比于直接用0,1,2对地图赋值可读性强很多。

但是说到符号化数字,可以使用#define宏来达到相同目的,但是宏只是在编译阶段进行简单的替换,编译器不进行类型检查而且在程序中大量使用宏也会使程序变得繁琐。而enum类型在替换时会进行类型检查,降低了程序出错的可能性。

 

二、枚举类型用法

1、枚举成员的值

默认第一个成员为0,以后依次+1

可以指定成员的值,以后的成员如果不指定,为上一个成员值+1

 

2、对枚举变量赋值

enum MapInfo { GROUND , SNAKEHEAD,SNAKEBODY } ;

MapInfo info = MapInfo::GROUND ;

当然也可以直接info = GROUND ;

 

3、限制赋值范围

对一个枚举变量赋值,如果直接使用整形常量,编译器不允许,可以达到限制赋值范围作用。

但是!仍然可以通过类型强制转化,将整形常量转化为枚举类型来进行赋值,只一点破坏了此作用。

 

4、int与枚举类型

int可以接受任何枚举类型成员和枚举变量的赋值

枚举类型变量正常情况下不能接受整形变量赋值。

 

三、枚举类型和常量

C++中的常量,例如 const int a =5 ;在之后将a做为右值对某变量赋值时,编译器其实是将a出现的地方替换为5.枚举类型也是如此,将枚举类型中的成员做为一个常量,在编译阶段进行替换,所以此时不分配内存空间,这点可以查看汇编代码。

例如:

enum Test { A,B,C} ;

int test = A ;

Test test2 = A ;

在编译时:

int test = 0 ;

Test test2 = 0 ;

 

但是在定义一个枚举类型的变量时,仍会分配内存空间。

但是枚举类型变量的大小是多少呢?

 

四、枚举类型变量的大小?

使用sizeof关键字,发现大小为4字节,等效于int型,那是不是枚举类型就是int型呢?

1、  为何大小是4字节?

C++标准规定的是,枚举类型的大小必须能容纳最大的成员,而且不能超过int型大小

也就是说不一定是4字节,如果成员1个字节就能容下,那它就是1个字节,但是测试后发现为什么还是4字节?因为这涉及到编译器对程序的优化和某些CPU对对齐的4字节计算有更高的效率等等原因,所以通常就直接算4字节。

新的C++标准可以声明占用字节

enum Test : char {A,B,C} ;

此枚举类型占1字节

2、  等效于int型?

使用新版的VS,对枚举类型变量直接赋值其他整形常量,发现编译错误,提示说“无法从int型转换为***(枚举类型名)型”所以说枚举类型和int型还是不同的,编译器区别对待!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章