首页 > 编程语言 >C++11:强类型枚举

C++11:强类型枚举

时间:2022-09-28 19:04:08浏览次数:84  
标签:11 Status Ok enum C++ 枚举


C++ 11引入了一种新的枚举类型,即“枚举类”,又称“强类型枚举”。声明请类型枚举非常简单,只需要在enum后加上使用class或struct。如:

enum Old{Yes, No};          // old style
enum class New{Yes, No}; // new style
enum struct New2{Yes, No}; // new style

“传统”的C++枚举类型有一些缺点:它会在一个代码区间中抛出枚举类型成员(如果在相同的代码域中的两个枚举类型具有相同名字的枚举成员,这会导致命名冲突),它们会被隐式转换为整型,并且不可以指定枚举的底层数据类型。

int main()
{
enum Status{Ok, Error};
//enum Status2{Ok, Error};//err, 导致命名冲突, Status已经有成员叫Ok, Error


return 0;
}

在C++11中,强类型枚举解决了这些问题:

int main()
{
enum class Status {Ok, Error};
enum struct Status2{Ok, Error};

//Status flag1 = 10; // err,无法隐式转换为int类型
//Status flag2 = Ok; // err,必须使用强类型名称
Status flag3 = Status::Ok;

enum class C : char { C1 = 1, C2 = 2};//指定枚举的底层数据类型
enum class D : unsigned int { D1 = 1, D2 = 2, Dbig = 0xFFFFFFF0U };

cout << sizeof(C::C1) << endl; // 1
cout << (unsigned int)D::Dbig << endl; // 编译器输出一致,4294967280
cout << sizeof(D::D1) << endl; // 4
cout << sizeof(D::Dbig) << endl; // 4


return 0;
}

参考资料:
1、​​​深入理解C++11:C++11新特性解析与应用 ​​​
2、​​​每个C++开发者都应该使用的十个C++11特性​


标签:11,Status,Ok,enum,C++,枚举
From: https://blog.51cto.com/u_3002289/5720710

相关文章

  • C++11:类的改进
    继承构造C++11允许派生类继承基类的构造函数(默认构造函数、复制构造函数、移动构造函数除外)。#include<iostream>usingnamespacestd;//基类classA{public:A(intx,......
  • C++11:右值引用
    左值、右值在C语言中,我们常常会提起左值(lvalue)、右值(rvalue)这样的称呼。一个最为典型的判别方法就是,在赋值表达式中,出现在等号左边的就是“左值”,而在等号右边的,则称为“右......
  • DFS算法练习 POJ1111; POJ1129; POJ2245; POJ2657
    POJ1111:importjava.util.Scanner;/***@Authorjinjun99*@DateCreatedin2022/9/279:49*@Description*@Sinceversion-1.0*/publicclassMain{......
  • 【C++】从零开始的CS:GO逆向分析2——配置GLFW+IMGUI环境并创建透明窗口
    【C++】从零开始的CS:GO逆向分析2——配置GLFW+IMGUI环境并创建透明窗口 使用的环境:VisualStudio2017,创建一个控制台程序作为工程文件1.配置glfw在github上下载GLFW......
  • C++11:初始化
    类内成员初始化classMem{public:Mem(inti):m(i){}//初始化列表给m初始化intm;};classGroup{public:Group(){}private:intdata=1;//使用"=......
  • C++11:移动语义
    为什么需要移动语义#include<iostream>usingnamespacestd;classTest{public:Test(inta=0){//普通构造函数d=newint(a);cout<<"构造函......
  • C++11:std::move和std::forward
    标准库函数std::move既然编译器只对右值引用才能调用转移构造函数和转移赋值函数,而所有命名对象都只能是左值引用,如果已知一个命名对象不再被使用而想对它调用转移构造函数......
  • Java11安装(win11)
    下载JDK解压版本下载后解压,并放到一个没有中文路径的目录,如图所示:配置Java环境变量以Windows11系统为例,打开设置,搜索“环境”,点击“编辑系统环境变量”,如图所示:点击......
  • c++可执行文件产生过程
    https://blog.csdn.net/qq_34799070/article/details/125472381#ifndefTEST#defineTEST#include<iostream>usingnamespacestd;voidtest(){cout<<"h......
  • C++问题汇总——长期更新
    避免使用vector<bool>,尽量使用bitset或者deque<bool>因为vector<bool>不是容器,底层是bool值按bit存储STLlist容器数据结构上看是带空头的双向循环链表容器迭代......