C++中的枚举的意义具体是有什么样的意义?

在基本的数据类型中,无外乎就是些数字和字符。但是某些事物是较难用数字和字符来准确地表示的。比如一周有七天,分别是Sunday、Monday、Tuesday、Wednesday、Thursday、Friday和Saturday。如果我们用整数0、1、2、3、4、5、6来表示这七天,那么多下来的那些整数该怎么办?而且这样的设置很容易让数据出错,即取值超出范围。我们能否自创一个数据类型,而数据的取值范围就是这七天呢?
C++中有一种数据类型称为枚举(Enumeration)类型,它允许用户自己来定义一种数据类型,并且列出该数据类型的取值范围。
我们说变量就好像是一个箱子,而数据类型就好像是箱子的类型,所以我们在创建某个枚举类型的变量的时候,必须先把这个枚举类型设计好,即把箱子的类型设计好。定义枚举类型的语法格式为:
& & enum 类型名{常量1[,常量2,&&常量n]};
定义枚举类型的位置应该在程序首次使用该类型名之前,否则程序无法识别该类型。枚举类型中我们列出的常量称为枚举常量。它并不是字符串也不是数值,而只是一些符号。
如果我们要定义一周七天的日期类型,可以这样写:
& & enum day{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};
这时候,程序中就有了一种新的数据类型&&day,它的取值范围就是Sunday到Saturday的那七天。我们已经把类型设计好,下面我们就能来创建一个day类型的变量了:
这样,day类型的变量today的值就是Tuesday了。
下面我们来写一段程序来运用一下枚举类型的数据:(程序9.1)
#include &iostream.h&
enum day{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};
void nextday(day &D);//向后一天是星期几,参数为day类型,是程序中首次使用该类型名
void display(day D);//显示某一天是星期几
int main()
& &day today=S
& &for (int i=0;i&7;i++)
& & & cout &&&Data in today=& &&today &&
& & & display(today);
& & & nextday(today);&
& &return 0;
void nextday(day &D)
& &switch(D)
& & & case Sunday:
& & & & &D=M
& & & case Monday:
& & & & &D=T
& & & case Tuesday:
& & & & &D=W
& & & case Wednesday:
& & & & &D=T
& & & case Thursday:
& & & & &D=F
& & & case Friday:
& & & & &D=S
& & & case Saturday:
& & & & &D=S
void display(day D)
& &switch(D)
& & & case Sunday:
& & & & &cout &&&Sunday& &&
& & & case Monday:
& & & & cout &&&Monday& &&
& & &case Tuesday:
& & & &&cout &&&Tuesday& &&
& & & case Wednesday:&
& & & &&cout &&&Wednesday& &&
& & & case Thursday:
& & & &&cout &&&Thursday& &&
& & & case Friday:
& & & &&cout &&&Friday& &&
& & & case Saturday:
& & & &&cout &&&Saturday& &&
运行结果:
Data in today=0
Data in today=1
Data in today=2
Data in today=3
Data in today=4
Data in today=5
Data in today=6
根据运行结果,我们发现在day型变量today中保存的竟然是整数!也就是说,一个整数和一个枚举常量一一对应了起来,要注意是一一对应,而不是相等。但是如果我们把整数直接赋值给today变量,则会发生错误。虽然枚举类型的实质是整数,但是电脑还是会仔细检查数据类型,禁止不同数据类型的数据互相赋值。另外,在一般情况下,枚举类型是不能进行算术运算的。
微信公众号:
各位粉丝,大家好,我是C语言中文网的站长(可以了解我),C语言中文网已经开通了微信公众号,名字是「码农宿舍」(不是C语言中文网哦),我将在这里和大家交流编程知识以及工作经验。大家可以搜索名字「码农宿舍」关注,也可以用微信扫描右边的二维码关注。
当你决定关注「码农宿舍」,你已然超越了99%的程序员!
推荐文章 TOP10在c++中,枚举都有什么特点?有什么优点?_百度知道
在c++中,枚举都有什么特点?有什么优点?
提问者采纳
只要将需要的变量值一一列举出来,便构成了一个枚举类型。枚举类型的声明如下:
enum 枚举类型名 {变量值列表};枚举类型有几点需要特别注意:(1)对枚举元素按常量处理,不能对他们赋值。(2)枚举元素具有默认值,他们依次是:0 1 2 3 ....(3)枚举值可以进行关系运算(4)整数值不能直接赋给枚举变量;如果要将整数赋值给枚举变量,应进行强制类型转换。
其他类似问题
为您推荐:
您可能关注的推广
枚举的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁c++枚举类型枚举变量有什么用_百度知道
c++枚举类型枚举变量有什么用
书上说一个枚举变量保存一个枚举值,程序通过判断其保存的值不同来决定执行什么动作。可是看下面这个程序#include&iostream&int main (){ enum Day{MONDAY=1, TUESDAY, FRIDAY}
cin&& switch (number) {
case MONDAY :
cout&&&good&;
case TUESDAY:
cout&&&well&;
case FRIDAY:
cout&&&better&;
} system (&pause&); return 0;}day完全没有排上用场,及时不写也是正确的。但如果直接cin&&day,它却提示是错误的那么这个枚举变量有什么用呢
提问者采纳
关键在于那个day不能通过cin输入,只能输入一个整数转化为枚举类型。但是枚举的意义就在于不直接写数字而使用标识符来表示抽象的概念,所以不应该直接输入这个枚举值,直接输入就失去了标识符的意义,直接用数字就好了,你的代码也证明了这一点。枚举值一般都是直接用的而不是输入的,是某种中间结果,而不是直接输入的。
{MONDAY=1, TUESDAY, FRIDAY}是我的枚举值,用数字number的输入来间接使用了枚举值MONDAY或者TUESDAY等,但那个day不就没有任何作用吗?为什么书本上要加一个它
少年,如果是书上的程序的话,我可以负责任的告诉你,中文的书上没有瑕疵的代码,实在是太少了。
提问者评价
太给力了,你的回答完美的解决了我问题!
来自团队:
其他类似问题
为您推荐:
其他2条回答
day在这里好像没什么用,只不过是一个Day类型的枚举变量。还有switch语句最后最好加上default。cin&&day是错误的,因为只能用MONDAY,TUESDAY,FRIDAY来赋值。
用枚举主要是为了增强程序的可读性,一般作为中间结果。
枚举类型的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁7580人阅读
为啥需要枚举类型
编程语言中的所有特性都是为了满足某种需求,达到某个目的还出现.不会莫名其妙的出现在那.
枚举可以用来保存一组属性的值.enum的全称是enumeration意思是列举
看着这句话可能觉得太书面化了,不够通俗易懂.那举些通俗的例子说说.日常生活中我们特喜欢分类,比如读书时分啥数,理,化.当官的级别有啥省长,市长,县长.军队有军长,师长,团长.这样一组组的属性值就最适合用枚举类型来表示.当用一个软件时,有些页面会有很多单选按钮(radio button),这也特别适合用枚举来表示你举了哪一个.
光这样说你可能还不能体现枚举的好处.如果没枚举,表示一些组属性的值你只能用一组数字,或者一组字符串.
数字从字面上看不出任意意义,可读性非常差,所以很少用.那就假如要你通过比较字符串来做很多种类判断,比如 if(HisTitle == &stadholder&)&& else if(HistTile == &mayor&) .如果让你敲个几十次你就知道是件多麻烦痛苦的事了,很多单词如果敲错一个意思就完全变了,这样出现bug了也不容易找到.老是复制粘贴也较麻烦.所以字符串是编辑麻烦,容易出错.如果要使用枚举就极大的方便我们敲代码,集成开发工具中的智能感应会给你提示,敲个点号就带出来了.而且枚举会做类型检查,不会像字符串那样只能靠你自己去对比.
枚举类型的内存分配问题
上面我们讲了如果没有枚举,一般会想到用数字或字符串表示某个类别.这样使用肯定不方便.也许你可能会想到用宏来表示.比如#define 市长 &mayor& 或者#define 市长 2
这自然是一个方法,但一来嘛在C++中是不太推荐用宏的,尽量少用.因为C++是强类型的语言,希望通过类型检查来降低程序中的很多错误,而宏只是在编译期前做简单替换,绕过了类型检查,失去了强类型系统的优势支撑. 二来嘛一组属性值都是相关联的信息,必须放到一起,放到一组.
关于常量的误解
枚举类型成员是常量
这句话怎么理解呢.也就是说enum& MyEnum{ one = 1&, two , three} ;
与 const int one = 1;& const int two = 2; const int three = 3; 差不多是一样的.
说到常量其实有个非常误导人的地方因为用宏#define 可以定义的我们说是常量,这里只涉及到简单的替换自然不可能存在内存分配问题.但是用const定义的也叫常量,而const定义常量貌似跟定义一般的变量只多个const关键字. 你可能会想当然认为常量都只是简单替换,所以不存在内存分配.那按这个逻辑,岂不是const定义的常量,枚举类型都没有内存分配?
实际上大部分时候确实是这样的.但并非总是如此,有些情况会需要分配内存的.
1.不需要分配内存的情况
如果定义常量const int one = 1;然后在其他地方只是把one作为右值赋值给其他变量那就不存在内存分配.但这里的常量跟#define定义的常量不同,宏定义的常量是编译前简单替换掉,而不需要做类型检查.而const定义的常量在编译时会帮类型检查,编译完之后再做替换.所以编译完之后就看不到const的信息了,转换成对应的值.const定义的信息只是保存在符号表中.
那同样,如果只是enum MyEnum{ one = 1 , two , three} ;这样定义一个枚举类型,然后也是简单的作右值赋值给其他变量.比如int num = MyEnum::那也只是保存信息在符号表中,编译后被替换掉了.
有人可能说如果用sizeof MyEnum测下会发现会是4(这是VS里面,不同的编译器可能不一样)于是认为不管是枚举里面有多少个元素内存分配都是4.实际上不是这意思,应该是定义一个MyEnum类型的枚举变量时会分配内存.这跟定义了一个类一样,你用sizeof去测一个为也会看到大小,但我们知道只有当类实例化之后才实际分配内存的.
2.需要分配内存的情况
1.)是类的成员变量 2. )extern const int one = 123;&&& 3.)const int one = 1;&&& int* pConst = &
上面三种情况会需要分配内存.
而枚举类型,如果不是简单的去给其他变量赋值,而是去定义一个枚举类型变量.
比如MyEnum grade = MyEnum:: //此时会分配4字节内存空间.(不过据说编译器会做优化,如果枚举类型所有值用两个字节表示就足够了,那实际分配的会就只会是两字节了.不一定就是默认的int类型的长度)
枚举类型具体用法
一般的用法是在全局域内定义一个枚举类型.比如
enum& MyEnum { one, two, three }
如果不显式指定,就会把第一个值默认赋值为0,然后递增1依次赋值.如果显式指定了某个值,则它下一个是它加1.
所以上面的例子中默认one = 0; two = 1; three= 2;
如果显式指定enum MyEnum { one, two = 3, three }
则one = 0; two = 3; three = 4;
定义一个枚举类型就是MyEnum grade = MyEnum::
类中使用枚举这是不太常用的用法.
在类中声明一个枚举后,定义枚举类型就可以省掉那个域作用前缀.比如MyEnum my = 在相同的作用域内也不能出现某个变量的名字和枚举中的元素名字相同,也就是不能出现其他变量名字是on,two, three
另外枚举还有一种少见的用法是
enum { one ,two ,three};& 就是不指定一个名字,这样我们自然也没法去定义一些枚举类型了.此时就相当于const int one = 0;这样定义三个常量一样.
然后用的话就是int no =
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:577533次
积分:8516
积分:8516
排名:第991名
原创:274篇
评论:89条
(1)(2)(2)(2)(4)(1)(3)(1)(4)(2)(3)(14)(7)(5)(12)(43)(14)(12)(4)(24)(35)(23)(1)(1)(13)(5)(1)(1)(4)(30)(3)(1)

我要回帖

更多关于 无法枚举容器中的对象 的文章

 

随机推荐