enum

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

语法:

enum 枚举名{ 
               标识符[=整型常数], 
               标识符[=整型常数], 

... 
               标识符[=整型常数], 

} 枚举变量;
#include < iostream.h> 

void main()  
...{  
//例1  
    enum day{Sun,Mon,Tue,Wed,Thu,Fri,Sat};//定义一个day的枚举  
    day d = Sun; //d只能等于"Sun,Mon,Tue,Wed,Thu,Fri,Sat"中的一个,没有其它值!  
    cout< < "value is "< < d< < endl;  

    //也可以定义多个变量  
    enum day{Sun,Mon,Tue,Wed,Thu,Fri,Sat};  
    day d1,d2,d3;  
    d1 = Thu; d2 = Sat; d3 = Tue;  
    cout< < "d1 && d2 && d3 "< < d1< < " "< < d2< < " "< < d3< < endl;   
}  

枚举值

  • 枚举元素的值默认情况下从0开始,依次递增。
//例2
enum day{Sun,Mon,Tue,Wed,Thu,Fri,Sat} d1,d2,d3,d4;  
d1 = Sun; d2 = Mon; d3 = Tue; d4 = Wed;  
cout< < d1< < " "< < d2< < " "< < d3< < " "< < d4< < endl; //输出0,1,2,3,4
  • 初始化时可以为枚举元素赋初值, 之后的标识符仍依次加1
enum day{Sun=10,Mon,Tue,Wed=1,Thu,Fri,Sat} d1,d2,d3,d4,d5,d6,d7;  
d1 = Sun; d2 = Mon; d3 = Tue; d4 = Wed; d5=Thu; d6=Fri; d7=Sat;  
cout<< d1<< " "<< d2<< " "<< d3<< " "<< d4<< " "<<d5<<" "<<d6<<" "<<d7<<endl; 
//输出 10 11 12 1 2 3 4
  • 也可以在外部对枚举变量进行赋值,不过,必须要进行类型转换
d1=(day)1

枚举类型的内存分配问题

枚举类型成员是常量。

关于常量的误解

   枚举类型成员是常量。

   这句话怎么理解呢.也就是说enum MyEnum{ one = 1 , two , three} ;

  与 const int one = 1; const int two = 2; const int three = 3; 差不多是一样的.

  说到常量,用宏#define 可以定义的我们说是常量,这里只涉及到简单的替换自然不可能存在内存分配问题.但是用const定义的也叫常量

1.不需要分配内存的情况
   如果定义常量const int one = 1;然后在其他地方只是把one作为右值赋值给其他变量那就不存在内存分配.

   但宏定义的常量是编译前简单替换掉,而不需要做类型检查.而const定义的常量在编译时会帮类型检查,编译完之后再做替换.所以编译完之后就看不到const的信息了,转换成对应的值.const定义的信息只是保存在符号表中.

   那同样,如果只是这样定义一个枚举类型,然后也是简单的作右值赋值给其他变量.比如enum MyEnum{ one = 1 , two , three} ;int num = MyEnum::one;那也只是保存信息在符号表中,编译后被替换掉了.

   有人可能说如果用sizeof MyEnum测下会发现会是4(这是VS里面,不同的编译器可能不一样)于是认为不管是枚举里面有多少个元素内存分配都是4.实际上不是这意思,应该是定义一个MyEnum类型的枚举变量时会分配内存.这跟定义了一个类一样,你用sizeof去测一个为也会看到大小,但我们知道只有当类实例化之后才实际分配内存的.

2.需要分配内存的情况

  1. const int one;是类的成员变量
  2. extern const int one = 123;
  3. const int one = 1; int* pConst = &one;
    上面三种情况会需要分配内存.

   而枚举类型,如果不是简单的去给其他变量赋值,而是去定义一个枚举类型变量.

   比如MyEnum grade = MyEnum::one; //此时会分配4字节内存空间.(不过据说编译器会做优化,如果枚举类型所有值用两个字节表示就足够了,那实际分配的会就只会是两字节了.不一定就是默认的int类型的长度)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值