1、枚举类型:
如果一个变量只能有几种可能的值,这样的变量可以定义成枚举类型。所谓的 “枚举” 是指可以将变量的值一一列举出来,变量的值只能在列举出来的值的范围内,其他的值对该变量没有意义,例如:星期几、人种颜色、性别、月份 等等。枚举类型也是一种自定义类型。

2、枚举类型的声明:
声明枚举类型用 enum 开头,例如:

enum ESex
{
        ESex_Male, //男性
        ESex_FMale //女性
};



以上就是定义了一个枚举类型 ESex,大括号内部的 ESex_Male、ESex_FMale 称为枚举元素或枚举常量。表示这个枚举类型可能的值。

注意事项:
①、枚举元素按常量处理,所以称作枚举常量。他们不是变量,所以不要对他们进行赋值,即枚举元素的值是固定的;
例如:ESex_Male = 8; 这种是错误的,大家可以在vs2013中试试;

②、枚举元素是常量,所以其也是有值的,他们的值是一个整数,按照元素声明时候的顺序从0开始依次进行+1操作,默认的值就是:0,1,2,3,...
例如,上面的ESex枚举类型中,ESex_Male 的值默认是0,ESex_FMale 的默认值是1,依此类推。

③、枚举元素有默认的值,但也可以在声明的时候指定值,例如:

enum EWeekDay
{
        EWeekDay_1 = 3,
        EWeekDay_2 = 4,
        EWeekDay_3 = 5,
        EWeekDay_4,
        EWeekDay_5,
        EWeekDay_6,
        EWeekDay_7,
};


其中从 EWeekDay_4 开始未赋值,所以按照他的上一个元素的值+1的规则进行默认赋值,也就是 EWeekDay_3 + 1 = 6。
这里面有个注意事项,即,上面赋值的最好是依次增大,不然有可能会造成两个枚举元素是一样的值,例如:

enum EWeekDay
{
        EWeekDay_1 = 3,
        EWeekDay_2 = 2,
        EWeekDay_3 = 1,
        EWeekDay_4,
        EWeekDay_5,
        EWeekDay_6,
        EWeekDay_7,
};



④、枚举值可以用来进行跟整数一样的判断,比较,switch-case 等操作,例如:

int ab = 2;
if(EWeekDay_1 > ab )
{
    //...
}



⑤、虽然枚举类型的变量可以看做是整形类型的变量,但是不能把普通的整数赋值给枚举类型变量,例如:
EWeekDay day = 2;
这种是错误的,除非进行强制类型转换,但是不建议。最好还是:
EWeekDay day = EWeekDay_2;

3、枚举类型举例:枚举类型和结构体类型结合:

struct Student
{
    string name;
    int num;
    ESex sex;
    int age;
};

Student stu;
stu.sex = ESex_Male;


4、用 typedef 类型声明新的类型名字:
除了可以用 struct 结构体,union 联合体,enum 枚举 等自定义类型以外,还可以使用 typedef 声明一个新的类型名字来代替已有的类型名。注意是新的类型名字,只是名字而已,不是一种全新的类型,只是改个名字而已。
例如,我们定义一个无符号的整型int变量可以这样来定义:unsigned int a = 5;
类型的名字比较长,unsigned int,而且以后所有定义无符号的整型int变量都得这么写,那么有没有简单的写法呢,typedef就派上用场了,咱们可以给 unsigned int 改个名字,例如:
typedef unsigned int uint;
uint a = 5;
所以,以后所有的 unsigned int 都可以改成 uint 了,方便吧?同理,其他的类型也都可以使用 typedef 改名,例如:
typedef int myint;
typedef unsigned long ulong;
typedef Student StuT;
typedef EWeekDay EWDay;
以上,都是可以的哦!

5、小作业:
课后自己练习定义枚举类型变量以及使用 typedef 定义新的类型名!