若是一个变量你须要几种可能存在的值,那么就能够被定义成为枚举类型。之因此叫枚举就是说将变量或者叫对象可能存在的状况也能够说是可能的值一一例举出来。html
举个例子来讲明一吧,为了让你们更明白一点,好比一个铅笔盒中有一支笔,但在没有打开以前你并不知道它是什么笔,多是铅笔也多是钢笔,这里有两种可能,那么你就能够定义一个枚举类型来表示它!ios
- enum box{pencil,pen};//这里你就定义了一个枚举类型的变量叫box,这个枚举变量内含有两个元素也称枚举元素在这里是pencil和pen,分别表示铅笔和钢笔。
这里要说一下,若是你想定义两个具备一样特性枚举类型的变量那么你能够用以下的两种方式进行定义!ide
- enum box{pencil,pen};
- enum box box2;//或者简写成box box2;
再有一种就是在声明的时候同时定义。函数
- enum {pencil,pen}box,box2; //在声明的同时进行定义!
枚举变量中的枚举元素系统是按照常量来处理的,故叫枚举常量,他们是不能进行普通的算术赋值的,(pencil=1;)这样的写发是错误的,可是你能够在声明的时候进行赋值操做!学习
- enum box{pencil=1,pen=2};
可是这里要特别注意的一点是,若是你不进行元素赋值操做那么元素将会被系统自动从0开始自动递增的进行赋值操做,说到自动赋值,若是你只定义了第一个那么系统将对下一个元素进行前一个元素的值加1操做,例如spa
- enum box{pencil=3,pen};//这里pen就是4系统将自动进行pen=4的定义赋值操做!
前面说了那么多,下面给出一个完整的例子你们能够经过如下的代码的学习进行更完整的学习!htm
- #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语言,你要必须知道一件事:一切都是对象,一切都有类型···blog
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://hi.baidu.com/wy_51131/blog/item/7251e7cf45d38d0592457e87.html#0