问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

枚举类型的用法?

发布网友 发布时间:2022-04-29 21:26

我来回答

2个回答

懂视网 时间:2022-04-30 01:47

FileAccess枚举

标签:

热心网友 时间:2022-04-29 22:55

C/C++中枚举类型(enum)
如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。 举个例子来说明一吧,为了让大家更明白一点,比如一个铅笔合中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔,这里有两种可能,那么你就可以定义一个枚举类型来表示它! 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的定义赋值操作!

C++ 中的枚举类型继承于 C 语言。就像其他从 C 语言继承过来的很多特性一样,C++ 枚举也有缺点,这其中最显著的莫过于作用域问题——在枚举类型中定义的常量,属于定义枚举的作用域,而不属于这个枚举类型。例如下面的示例:enum FileAccess {
Read = 0x1,
Write = 0x2,
};FileAccess access = ::Read; // 正确
FileAccess access = FileAccess::Read; // 错误C++枚举的这个特点对于习惯面向对象和作用域概念的人来说是不可接受的。首先,FileAccess::Read 显然更加符合程序员的直觉,因为上面的枚举定义理应等价于如下的定义(实际上,.NET 中的枚举类型便是如此实现的):class FileAccess {
static const int Read = 0x1;
static const int Write = 0x2;
};其次,这导致我们无法在同一个作用域中定义两个同样名称的枚举值。也就是说,以下的代码是编译错误:enum FileAccess {
Read = 0x1,
Write = 0x2,
};enum FileShare {
Read = 0x1, // 重定义
Write = 0x2, // 重定义
};如果这一点没有让你恼怒过的话,你可能还没写过多少 C++ 代码 :-)。实际上,在最新的 C++0x 标准草案中有关于枚举作用域问题的提案,但最终的解决方案会是怎样的就无法未卜先知了,毕竟对于象 C++ 这样使用广泛的语言来说,任何特性的增删和修改都必须十分小心谨慎。当然,我们可以使用一些迂回的方法来解决这个问题(C++ 总是能给我们很多惊喜和意外)。例如,我们可以把枚举值放在一个结构里,并使用运算符重载来*近枚举的特性:struct FileAccess {
enum __Enum {
Read = 0x1,
Write = 0x2
};
__Enum _value; // 枚举值 FileAccess(int value = 0) : _value((__Enum)value) {}
FileAccess& operator=(int value) {
this->_value = (__Enum)value;
return *this;
}
operator int() const {
return this->_value;
}
};我们现在可以按照希望的方式使用这个枚举类型:FileAccess access = FileAccess::Read;并且,因为我们提供了到 int 类型的转换运算符,因此在需要 int 的地方都可以使用它,例如 switch 语句:switch (access) {
case FileAccess::Read:
break;
case FileAccess::Write:
break;
}当然我们不愿意每次都手工编写这样的结构。通过使用宏,我们可以很容易做到这一点:#define DECLARE_ENUM(E) \
struct E \
{ \
public: \
E(int value = 0) : _value((__Enum)value) { \
} \
E& operator=(int value) { \
this->_value = (__Enum)value; \
return *this; \
} \
operator int() const { \
return this->_value; \
} \
\
enum __Enum {#define END_ENUM() \
}; \
\
private: \
__Enum _value; \
};我们现在可以按如下的方式定义前面的枚举,并且不比直接写 enum 复杂多少。DECLARE_ENUM(FileAccess)
Read = 0x1,
Write = 0x2,
END_ENUM()DECLARE_ENUM(FileShare)
Read = 0x1,
Write = 0x2,
END_ENUM()
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
美的面包机和面要多久 美的面包机和面的时间要多长 美的面包机怎么用手动操作 如何用美的面包机发面 如何用美的面包机和面 美的面包机如何和面 CDR教程—教你如何使用CorelDRAW复制图形方法 苹果手机微信怎么换漂亮字体(苹果手机微信怎么换行输入) 有什么好用的app转换字体 手写转文字的软件 erp可以看评论地址吗 淘宝评论url是什么意思? 张柏芝生图状态清新大气,颜值不掉线,她的容颜为何能保持不老? 菲洛嘉跟伊菲丹面膜哪个好 孕妇面膜和普通的面膜有区别吗? 伊菲丹超级面膜对皮肤的保湿怎么样? ...详细的教程适合纯零基础小白学习的短视频制作教程推荐一下?_百度知 ... 汉口银行的九通惠存是是存款吗? 华为手机怎么设置在桌面上显示步数 ps修图显示器效色与亮度对比度调节? photoshop颜色设置里的sRGB 和显示器颜色有什么区别? 电脑无法调亮度 lggp850怎么样 显示器里的sRGB模式是一种怎样的模式? 无法调节显示器的亮度和对比度 srgb模式有什么好处 显卡重新安装了,屏幕亮度还是不能调 康佳电视usb接口是哪个 ?可以插u盘吗? 优派VA1916W液晶显示器,当采用SRGB的色彩模式时,不可调亮度和对比度。有什么问题吗? LED43X8800B型号的康佳电视机连接音象设备的USB插口在哪里?现有的插头都不能显示。 康佳b58u有usb接口吗,没找着 我的显示器颜色不好,在调亮度和对比度时不能调,它显示的是SRGB不知道是怎么回事,是三星的显示器 现在市面上的金骏眉红茶让人们眼花缭乱,什么是好的金骏眉呢?谁知道正山堂金骏梅? 正山堂的介绍 看电视的时候应该做哪些眼保健操,才能够缓解眼睛疲劳? 做眼保健操需要注意什么? 正山堂的茶叶能打几折 冰箱第一层是冷藏室还是变温室 小学六年级优秀作文中的第一次掰玉米 怎么在word里面画图? 玉米地里像牛叫的声音是什么声音 玉米地里的蜗牛怎样杀死啊?? 俗称纺花嗯的昆虫学名是什么?常在玉米地里飞来飞去,翅膀发出嗡嗡嗡 昨晚我们这里出现灵异现象,半夜有两人去山上玉米地浇地,听见玉米地里有女的在哭,顺着哭声走进深处接近 跟蜈蚣类似的黑色虫子是什么,玉米地里有很多,我家距离地比较近所以家里也不少,用脚踩上去咯吱咯吱的声 实现基地玉米地作文100五篇 花养养都死心怎么办 阳光小学开展植树活动,六一班栽了30棵树,比6(2)班少栽了25%。两个班共栽了多少棵树? 为什么这种花养养无辜的它就掉叶了请帮老师请老师帮你指导一下?_百度... 春光小学开展植树活动。种柳树180棵,种杨树的棵树是柳树的6分之5。种杨树多少? 为什么新买的月季花养养就死了 红星小学开展植树绿化活动,栽柏树240棵,栽的松树比柏树的2倍多45棵,松树比柏树多栽了多少棵?