C++学习篇--enum枚举类型

来源:互联网 发布:卷积神经网络算法源码 编辑:程序博客网 时间:2024/05/16 08:21

     enum枚举类型以前没有深究过,查了一些资料和几个博文,现总结了一下

ENUM概况

enum枚举类型是C/C++中的一种数据类型,与struct和class一样是用户自定义的类型,其特点在于enum类型的变量取值是有限的,是可以一一列举出来的。

ENUM定义

C++ enum枚举格式:

enum < 枚举类型名> {< 枚举表>};

enum {< 枚举表>}< 变量名表>;

enum < 枚举类型名> : 整型类型{< 枚举表>};

其中,整型类型只能是char int long short 加unsigned或不加;指定存储类型,一般用于嵌入式;

第一个C++ enum枚举值对应着一个整型数,通常情况下如果其中的枚举常量没有定义数值,那么第一个枚举值对应着常量值0,然后依次递增,如果第一个枚举常量定义了数值,那么其后的值将随之递增,其中每个常量之间用“,”隔开,而不是“;”,最后一个数值不用符号。enum枚举类型的变量的名字不能相同,但是值可以相同

enum bool {false,true};  bool类型就是C++预定义的枚举

 EUM存储

关于占用内存的大小,enum类型本身是不占内存的,编译器直接替换。但是enum类型的变量肯定是占内存的

 ENUM求值范围和类型分配

关于确定enum的取值范围,如果一个enum中所有的枚举值非负,那么枚举的表示范围是[0,2^k - 1],其中2^k是使得所有枚举值位于此范围内的最小的2的幂。如果是有负值,那么范围就是[-2^k,2^k-1]。因此对一个给定的整数值,如果使用强制转换,而其值又不在枚举的表示范围以内,其行为是未定义的。
举一个例子

enum EnumTest{a =1,b = 5};

其中没有负数,最大值是5,二进制表示是101,需要3bits能够容纳下。因此取值范围是[0,7]。

enum EnumTest{ a =-2,b = 5};

绝对值最大的是5,需要3bits能够容纳下,但是因为有负值,需要增加一个符号位,于是需要4bits,取值范围是[-8,7]。
C++规定枚举的大小只要能够容纳下3bits或者4bits(上面的例子)就行,至于分配1byte还是4bytes,是编译器决定的,但是C++标准有个限制:1<=sizeof(enum)<=sizeof(int)。

ENUM作用域范围

enum表中列出的枚举值不能和enum在同一作用域内的变量名相同,否则会报错,这是因为enum是非聚合类型,并不需要通过枚举类型或者枚举变量引用枚举值。

        enum E {a,b,c};E e;int a;//报错cout << E::a << endl;//报错cout << e.a << endl;//报错
补充一下,C和C++关于类型的区别,在C中struct、union、enum加后面的类型名才能构成一种类型,单独的类型名只是结构的名称而已;而在C++中类型名就是一种类型

enum A {a,b,c};cout << sizeof(A) << endl;//C中报错,因为A只是enum的名称不是类型 cout << sizeof(enum A) << endl;
ENUM和宏、const常量的区别
enum结构体定义都是一些常量值,放在静态常量存储区。类似于类里面声明为static const的常量;宏是在预编译的时候进行替换,而enum是在编译时被替换,从enum定义的常量存储区取定义的常量值

说到常量,宏#define 可以定义常量,在预编译的时候进行替换,无需分配内存。const定义的常量比较复杂,在转载的文章中已提到,不再赘述。

#include <iostream>using namespace std;class A{//没有成员变量的类不能为空,所以测试EnumTest会有问题,所以加个int,内存为4int s;    //enum类型本身不占内存    enum EnumTest{a = 1, b = 5};};enum EnumTest{ a =1,b = 5};class B{    //enum理想的变量会占用内存    enum EnumTest e;};int main(){    enum EnumTest:unsigned short{    a =2,b = 5};     /*cout << sizeof(enum EnumTest) << endl;   这个语句会报错,enum类型重定义;去掉enum就没有报错*/    //注意:此处结果是未定义的    //enum EnumTest enumSample1 = (enum EnumTest)10;printf("%d\n",sizeof(EnumTest));    cout << "sizeof(Class A) = " << sizeof(A) << endl;    cout << "sizeof(Class B) = " << sizeof(B) << endl;char arr[a] ={'c','d'};cout << arr[1] << endl;cout << ::a << endl;    return 0;}

0 0
原创粉丝点击