[技术| 编程·课件·Linux] 关于C++中enum的探讨

admin · 发布于 2013-07-09 19:53 · 1116 次阅读
1

如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。


举个例子来说明一吧,为了让大家更明白一点,比如一个铅笔盒中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔,这里有两种可能,那么你就可以定义一个枚举类型来表示它!


enum box{pencil,pen};//这里你就定义了一个枚举类型的变量叫box,这个枚举变量内含有两个元素也称枚举元素在这里是pencil和pen,分别表示铅笔和钢笔。

  这里要说一下,如果你想定义两个具有同样特性枚举类型的变量那么你可以用如下的两种方式进行定义!

enum box{pencil,pen};
enum box box2;//或者简写成box box2;

 

 再有一种就是在声明的时候同时定义。


enum {pencil,pen}box,box2; //在声明的同时进行定义!

  枚举变量中的枚举元素系统是按照常量来处理的,故叫枚举常量,他们是不能进行普通的算术赋值的,(pencil=1;)这样的写发是错误的,但是你可以在声明的时候进行赋值操作!

enum box{pencil=1,pen=2};


但是这里要特别注意的一点是,如果你不进行元素赋值操作那么元素将会被系统自动从0开始自动递增的进行赋值操作,说到自动赋值,如果你只定义了第一个那么系统将对下一个元素进行前一个元素的值加1操作,例如

enum box{pencil=3,pen};//这里pen就是4系统将自动进行pen=4的定义赋值操作!


  前面说了那么多,下面给出一个完整的例子大家可以通过以下的代码的学习进行更完整的学习!


#include <iostream>
using namespace std;

void main(void)
{
    enum egg {a,b,c};
    enum egg test; //在这里你可以简写成egg test;

     test = c; //对枚举变量test进行赋予元素操作,这里之所以叫赋元素操作不叫赋值操作就是为了让大家明白枚举变量是不能直接赋予算数值的,例如(test=1;)这样的操作都是不被编译器所接受的,正确的方式是先进行强制类型转换例如(test = (enum egg) 0;)!

    if (test==c)
     {
        cout <<"枚举变量判断:test枚举对应的枚举元素是c" << endl;
     }

    if (test==2)
     {
        cout <<"枚举变量判断:test枚举元素的值是2" << endl;
     }

    cout << a << "|" << b << "|" << test <<endl;

    test = (enum egg) 0; //强制类型转换
    cout << "枚举变量test值改变为:" << test <<endl;
    cin.get();
}


  看到这里要最后说一个问题,就是枚举变量中的枚举元素(或者叫枚举常量)在特殊情况下是会被自动提升为算术类型的!


#include <iostream>
using namespace std;

void main(void)
{
    enum test {a,b};
    int c=1+b; //自动提升为算术类型
    cout << c <<endl;
    cin.get();
}


enum是用户自定义类型,他有数据成员,还有成员函数!

For example:
enum e{a=1 , b=2 , c=4};
那么:
001: enum e e1;        //enum e不是对象,它是类型,e1才是类型enum的对象!
002: e e1;             //e是类型enum e的简写哦!

003: e1 = 1;              //绝对的错误!int怎能赋值给一个用户自定义类型
004: e1 = e();          //e()? 对呀,你没看错,默认构造函数
005: e1 = e(1)           //e(int)? 嘿嘿,这才是从int构造enum e类型对象的构造函数
006:e1 = a;              //哈哈,默认调用“拷贝构造函数”···虽然有点不完备

大胆的想:enum会不会有用户自定义成员函数呢?呵呵,我是没有实验出来。要不,你自己试试?
感想:C++虽然是初期的OO语言,但是类型化的概念已经深入到了语言本身。面对一门OO语言,你要必须知道一件事:一切都是对象,一切都有类型···

enum的“取值范围”和“内存分配”

先纠正一个常见错误,很多人认为enum是个离散量集合,太理想化了^_^,简单思考一下就破了,不多说,入正题:
如何确定一个enum的取值范围?
For example:
         enum e1{ a=2, b=4 };

首先找到其绝对值的最大值,但为了容易理解,我先不谈负数,也就是先找到其最大值,这里的最大值是4。
4 用二进制表示就是 100,也就是需要3bits才能最小的容纳下4这个值,而3bits所能表示的范围是 0-7,于是e1的取值范围为[0,7]。

现在来看看负数,
         enum e2{ a=-2, b=4 };
其中绝对值最大的是4,需要3bits才能容纳下,但因为可以取负值(而最大元素b=4不是负值),也就是说需要增加一个符号位,那么就需要4bits。
4bits的取值范围是 1000 - 0111(二进制表示),也就是 -8 到 7(十进制表示)。
enum e3{ a=-4, b=2 } 就只需要3bits,取值范围是[-4,3]。


简单的说就是找到最少的能容纳下所有的元素的位数
为什么要获取enum的取值范围?因为C++标准规定超出枚举类型表示范围的赋值结果是undefined的。
也就是说 e2 x = (e2)6 是肯定正确的,而 e2 y = (e2)8 行为是未定义的。
undefined的含义我就不多说了,想怎么去歪解就怎么去歪解^_^

enum的内存分配呢?

比如 e2 需要3bits,那么C++规定e2的尺寸只要容得下3bits就行,到底是取1个byte,还是4个byte,还是...,那由编译器自己决定。但是,C++标准在这里有个限制:1<= sizeof(enmu)<=sizeof(int)。嘿嘿。

原文:http://www.cnblogs.com/ymy124/archive/2012/02/24/2366481.html


共收到 6 条回复
xywhere · #2 · 2013-7-9 20:00:14  回复
先顶 后看。。
antty · #3 · 2013-7-9 20:40:45  回复
顶下
lordboy · #4 · 2013-7-9 21:07:36  回复
[catsoul=1]不明觉厉[/catsoul]
terry · #5 · 2013-7-10 09:53:34  回复
学习了~
阎魔あい · #6 · 2013-7-10 10:18:36  回复
学习贴~~~~~~~赞
vo_ · #7 · 2013-7-15 13:39:25  回复 支持 反对
错过的好帖子  来学习学习~
回帖
B Color Image Link Quote Code Smilies
Command + Enter
快速回复 返回顶部 返回列表