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;}
- C枚举类型enum
- C枚举类型enum
- C#enum枚举类型
- 【C++】enum枚举类型
- enum枚举类型学习
- C++学习篇--enum枚举类型
- C语言:枚举类型enum
- C语言枚举类型enum
- C语言:枚举类型enum
- C语言enum枚举类型
- C\C++ enum枚举类型
- C/C++中枚举类型(enum)
- C/C++中枚举类型(enum)
- 新手入门:C/C++中枚举类型(enum)
- C/C++中枚举类型(enum)
- C/C++中枚举类型(enum)
- [C#]Enum枚举类型使用总结
- C/C++中的枚举类型enum
- [BZOJ 1008][HNOI2008]越狱
- arg 和 arg max
- 从零单排PAT1023,1024
- UITextView限制最大输入长度(UITextField相同)
- Android 4.0.3 源代码结构分析(一)
- C++学习篇--enum枚举类型
- Hadoop MapReduce Job性能调优——修改Map和Reduce个数
- 使用mutt+msmtp做linux邮件客户端
- 控制台彩色版“俄罗斯方块”
- 关于Ubuntu下apt的一些用法及和yum的比较
- [ Talk is Cheap Show me the CODE ] : jQuery Mobile工具栏
- Linux命令三
- [BZOJ 1007][HNOI2008]水平可见直线
- Host Controller transport layer and AMPs