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

 更新时间:2023年02月02日 10:04:46   作者:Shawn-Summer  
本文主要介绍了C++11中强类型枚举的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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;

}

我们总结出

  • 强类型枚举中的成员,只能采用名字::成员的方式进行访问
  • 强类型枚举类型的变量,只能和同是强类型枚举的值进行比较
  • 强类型枚举中的class关键词,可以用struct进行等价替换
#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 强类型枚举内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ STL关联式容器自定义排序规则的2种方法

    C++ STL关联式容器自定义排序规则的2种方法

    这篇文章主要介绍了C++ STL关联式容器自定义排序规则的2种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 全局静态存储区、堆区和栈区深入剖析

    全局静态存储区、堆区和栈区深入剖析

    在C++中,内存可分为系统数据区,自由存储区,文本区,const数据区,全局静态区,堆区和栈区
    2012-11-11
  • C++调试追踪class成员变量的方法

    C++调试追踪class成员变量的方法

    本文所讲的是不通过修改一个class的成员,就能够追踪其成员。方法就是类似C语言中的函数指针
    2013-11-11
  • 关于C++静态成员函数访问非静态成员变量的问题

    关于C++静态成员函数访问非静态成员变量的问题

    静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非静态成员
    2013-10-10
  • C语言 实现归并排序算法

    C语言 实现归并排序算法

    这篇文章主要介绍了C语言 实现归并排序算法的相关资料,需要的朋友可以参考下
    2016-11-11
  • 详解C++中的ANSI与Unicode和UTF8三种字符编码基本原理与相互转换

    详解C++中的ANSI与Unicode和UTF8三种字符编码基本原理与相互转换

    在C++编程中,我们有时需要去处理字符串编码的相关问题,常见的字符编码有ANSI窄字节编码、Unicode宽字节编码及UTF8可变长编码。很多人在处理字符串编码问题时都会有疑惑,即便是有多年工作经验的朋友也可能搞不清楚。所以有必要讲一下这三种字符编码以及如何去使用它们
    2021-11-11
  • C++编辑距离(动态规划)

    C++编辑距离(动态规划)

    这篇文章主要介绍了C++编辑距离(动态规划),编辑距离是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数,限免详细内容,需要的小伙伴可以参考一下
    2022-01-01
  • c++几种基本的插入排序(图文)

    c++几种基本的插入排序(图文)

    这篇文章主要介绍了c++几种基本的插入排序(图文),需要的朋友可以参考下
    2014-11-11
  • 深入理解C++编程中的局部变量和全局变量

    深入理解C++编程中的局部变量和全局变量

    这篇文章主要介绍了深入理解C++编程中的局部变量和全局变量,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言二叉树层序遍历

    C语言二叉树层序遍历

    这篇文章主要介绍了C语言二叉树层序遍历,文章基于C语言的相关资料展开详细的文章内容,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-04-04

最新评论