文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++11中强类型枚举的使用

2023-02-02 12:02

关注

1.C/C++98中的枚举的缺陷

枚举在C语言中是狠古老的类型,它分为匿名枚举和具名枚举,如果是匿名枚举,那么它的用法只有一种:

//方法一:
enum {Male,Female};

//方法二:
#define Male 0
#define Female 1

//方法三:
static const int Male=0;
static const int Female=1;

如上三种方法实现的效果是差不多的,不过采用宏方法会引起一些不必要的纠纷。方法一和方法三在实现效果上几乎完全一致,方法一和方法三等价替换。

对于具名枚举来说,一般用法就是声明一个变量是枚举类型的,然后该变量只能由枚举成员初始化和赋值

enum Gender{Male,Female};
Gender a=Male;
a=Female;
a=1;//错误

C/C++98中的枚举的缺陷主要是三个:

在C++11中,我们引入了名称空间的概念,我们同样希望枚举成员能够采用名字::成员的方式进行访问,而不是直接将大量的枚举成员暴露在当前名称空间中。
此外.我们更希望枚举类型独立于整型,或者说,至少它不应该自动转化为整型,例如下面这样。

    enum Gender{Male,Female};
    Gender a=Male;
    int b=a;
    int c=Female;

我们看最后一个缺陷,即枚举成员(或变量)的底层类型一般是整型,但是不同的编译器的设定不同,有可能一些是有符号整型,而另一种就是无符号整型。

enum Gender{Male=-1000,Female=9999};//这段代码可能在某些编译器中报错

2.强类型枚举的使用

强类型枚举(strong-typed enum)或者称之为枚举类,主要是针对上述三个缺陷进行了修补。

#include<iostream>
using namespace std;
enum class Type {General,Light,Medium,Heavy};
enum struct Category{General=1,Pistol,MachineGun,Cannon};

int main()
{
    Type t=Type::Light;
    t=General;//编译错误
    if(t==Category::General)//编译错误
        cout<<"A"<<endl;
    if(t> Type::General)//编译通过
        cout<<"B"<<endl;
    if(t>0)//编译错误
        cout<<"C"<<endl;
    cout<<is_pod<Type>::value<<endl;//1
    cout<<is_pod<Category>::value<<endl;

}

我们总结出

#include<iostream>
using namespace std;
enum class C: char{C1=1,C2=2};
enum class D: unsigned int {D1=1,D2=2,Dbig=0xfffffff0u};
int main()
{
    cout<<sizeof(C::C1)<<endl;
    cout<<(unsigned int)D::Dbig<<endl;
    cout<<sizeof(D::D1)<<endl;
    cout<<sizeof(D::Dbig)<<endl;
}

而且我们在声明强类型枚举的同时,可以显式定义它的底层类型,enum class C: char,为了通用性,C++11也对C风格枚举进行了这个优化,即允许C风格枚举规定底层类型.

实际上,强类型枚举也存在匿名类型,不过如果它是匿名的,你就无法访问它的枚举成员了,不过你可以使用decltype来找到名称,不过也是多此一举的,所以匿名强类型枚举没啥用。

到此这篇关于C++11中强类型枚举的使用的文章就介绍到这了,更多相关C++11 强类型枚举内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯