当前位置:C++技术网 > 资讯 > 数据类型:3 宏、常量、枚举、结构体和共用体对比分析之枚举

数据类型:3 宏、常量、枚举、结构体和共用体对比分析之枚举

更新时间:2015-06-23 17:01:45浏览次数:1+次

    第三篇  枚举
    枚举,字面意思是像数硬币一样的,将有限的比较少的种类一枚枚拿出来,对应不同的类型。比如1元,0.5元,0.01元,这三种硬币,很容易就一枚枚列举出来,每一个都代表一种类型。所以说呢,枚举是一种类型定义,而类型组成元素则是有限的固定的值,比如1元,0.5元,0.01元是有三个不同的固定的元素组成了三种类型。1元代表计算货币的单位是1元,0.5则是1元的一半,是另一种计算单位,0.01类似。想起周恩来在面对国外采访时问到中国有多少钱,周恩来回答的是当时的货币面额的总额的种数。这其实就是利用了枚举的类型来分的,最后得到一个让大家心服口服的答案。他是将这么多种面额来计算,其实就是将类型作为计算,打破了我们常规的思维。
    这里的枚举同样是针对类型的,并且是来定义类型的,和typedef有异曲同工之效。只不过,这种定义的类型的取值是能够一一列举出来的有限的数目,并且这里面的取值都是常量,不可修改。就像1元的硬币,国家确定了它的价值是1元,你是没法更改的,因此,枚举类型确定后,里面的值就是常量了,没法更改的。枚举内的常量的值,可以在定义枚举类型时初始化,而不可在以后修改,这和常量的设计思想是一样的。那么,看到这里,应该明白枚举是什么东西了吧。它是用来定义类型的东西。typedef也是用来定义类型的。不过两者还不一样,typedef相当于给现有的类型取别名,而枚举是将几个常数组合成一个取值范围为这几个常数的数据类型。和宏以及常量都相似,区别就是枚举的组成是由常量组成的,取值范围就只是这几个常量的一个,而这个枚举定义的类型和其他类型如整型变量一样使用。而枚举中的常量则是像一个宏,一个已经定义好的常量,即使这个枚举类型没有定义枚举变量 ,这些枚举类型中的常量依然可以使用,就当做常量一样使用,只是要注意作用范围的问题。超出范围则会出现“未定义的符号”的错误提示。组成枚举类型的常量和类中的静态成员变量一样,即使类没有实例化,类中的静态成员是可以直接使用一样的。
    而枚举的使用则和结构体以及公用体用法类似。enum 类型名{常量列表};而类型名是可以省略的,这样就构成了匿名枚举类型。匿名的也是这种类型,只是没有一个名字一样,类型本身还是存在的。就像没有给宠物取名,宠物还在,取了名就更好叫它一样的。那么在定义变量时,就是用枚举类型来定义的。如果有类型名,则直接使用类型名来定义。比如,enum E_TYPE{A,B,C}; E_TYPE val;  val就是枚举变量,取值就只有ABC三个字符代表的常量值,此时编译器会默认从零给三个符号定义常量数值,依次是:0,1,2 。要自己更改符号的常量值,给使用初始化语句。而如果是匿名的,如enum {A,B,C}; XXX val;  那这XXX代表的类型名该如何表示呢?如果是匿名的,你如果要指出一只匿名的猫,如果猫比较多,你怎么办,是不是就直接将这只猫整个抓过来就可以确定了呀。那么作为匿名的类型,那我们就将它的所有定义抓过来就可以了,道理是一样的,如enum {A,B,C} val; 这样就搞定了。不过这样就很繁琐了。所以此时为了减少类型的长度,要么就定义一个名字,要么就可以使用typedef来给这个匿名类型取个名字就行了,如 typedef enum {A,B,C} mytype;  mytype val; 这样就可以用自己定义的类型名字来声明变量了。这也是这些东西的各自的使用的场合和造出来的目的。这个思想,在结构体和枚举中的用法是一样的,所以,将这个方法和思路理解掌握了,基本这几种就不存在迷糊了。枚举和结构体以及共同体的相似就是在于都是有几个元素组成,而不同就在于,枚举的组成元素是常量,而结构体和共同体是变量。变量是赋值的,常量不可以。在引用他们定义的值时方法是一样的。