5.1 C++11强类型枚举

一、C枚举的缺陷

1.类型冲突

枚举值和类型都是全局可见的, 与正常C++的namespace、类等都是格格不入的,并且还容易导致冲突。

enum Type { General, Light, Medium, Heavy };
enum Category { General, Pistol, MachineGun, Cannon };

如果在相同作用域同时能访问到枚举Type和Category,则General会冲突。

当然我们可以通过namespace对全局枚举进行分隔。但使用时如果忘记写namespace,也还是会报错。


namespace T {enum Type { General, Light, Medium, Heavy };
}namespace {enum Category { General };
}#include <iostream>int main()
{T::Type t = T::Heavy;t = General;	//error.无法赋值,不能将匿名的Category::General赋值给T::Typeif (t == General) {	//仅对于匿名命名空间可以直接使用General。std::cout << "equal" << std::endl;}else {std::cout << "not equal" << std::endl;}system("pause");return 0;
}
  • 首先,对于匿名命名空间,或者使用using声明的命名空间,可以直接使用枚举值(15,16行的General),否则需要以命名空间::[枚举类型::]枚举值的方式访问。
  • 虽然可以访问,但是对于不同命名空间的不同枚举只能做比较(因为可以隐式转为int)。但是不能进行赋值操作,因为类型和作用域都不相同。

2.可以隐式转换为int

因为C的枚举是基于常量数值设计的,所以总是可以被隐式转为int,所以在算数运算(没有什么意义)和比较运算时,容易出错。(注意无法赋值)

这是因为隐式转换为整型后,没有了类型限制,则可以随意比较和算数运算。

#include <iostream>
using namespace std;
enum Type { General, Light, Medium, Heavy };
//enum Category { General, Pistol, MachineGun, Cannon }; // 无法编译通过,重复定义
了General
enum Category { Pistol, MachineGun, Cannon };
struct Killer {
Killer(Type t, Category c) : type(t), category(c){}
Type type;
Category category;
};
int main() {Killer cool(General, MachineGun);// ...// ...其他很多代码...// ...if (cool.type >= Pistol)cout << "It is not a pistol" << endl;// ...cout << is_pod<Type>::value << endl;          // 1cout << is_pod<Category>::value << endl;     // 1return 0;
}
// 编译选项:g++ -std=c++11 5-1-2.cpp

3.基础类型不定性

C++所基于的“基础类型”由编译器决定,也就意味着,他的符号性和存储空间是不确定的。

#include <iostream>
using namespace std;
enum C { C1 = 1, C2 = 2};
enum D { D1 = 1, D2 = 2, Dbig = 0xFFFFFFF0U };
enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFFFFLL};
int main() {cout << sizeof(C1) << endl;    // 4cout << Dbig << endl;    // 编译器输出不同, g++:4294967280,Vs2017:-16cout << sizeof(D1) << endl;      // 4cout << sizeof(Dbig) << endl;    // 4cout << Ebig << endl;    // g++:68719476735,vs2017:-1cout << sizeof(E1) << endl; // 8return 0;
}
// 编译选项:g++ 5-1-4.cpp

上面可以看到如果够用的话(Dbig),采用4字节存储。不够用的时候会自动扩展为8字节存储(Ebig),且对于Ebig和Dbig而言不同的编译器返回的值不同,这是因为符号性不一样导致。

二、强枚举类型

1.语法:

enum class/struct [enum-name] [:base-type]{};
  • 辅助记忆:因为叫强枚举-类型,所以是enum class 而非 class enum。
  • 将class换成struct并没有任何影响
  • enum-name后可以接基础类型,表示该枚举类型基于此基础类型创建(除wchar_t的其他任意类型)。

2.优点:

  • 强作用域,枚举值对于父作用域不直接可见,需要通过作用域访问
  • 不能隐式转换为int,而需要显示转换
  • 可以指定基础类型,以此确定存储空间和符号性。(这样我们可以在明确不需要太大空间时,指定较小尺寸的类型(如char)节省空间)

可以看到基本上就是为了解决C枚举的三个缺陷而设计的。

3.其他

强枚举类型也是可以匿名的,但是由于其枚举成员需要通过作用域访问,因此匿名强枚举类型可能无法访问成员,当然也可以使用decltype获取类型。

三、对原有枚举类型的扩展

对于C枚举,默认依旧由编译器实现基础类型,但是C++11允许其和强枚举类型一样,指定基础类型。

enum Type: char { General, Light, Medium, Heavy };

其次,在C++11中,枚举成员的名字除了会自动输出到父作用域,也可以在枚举类型定义的作用域内有效。

enum Type { General, Light, Medium, Heavy };
Type t1 = General;
Type t2 = Type::General;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/226193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CSS】用 CSS 写一个渐变色边框的输入框

Using_CSS_gradients MDN 多渐变色输入框&#xff0c;群友问了下&#xff0c;就试着写了下&#xff0c;看了看 css 渐变色 MDN 文档&#xff0c;其实很简单&#xff0c;代码记录下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta ch…

uniapp实现检查版本检测,更新

1.首先需要获取当前app的版本 const systemInfo uni.getSystemInfoSync();// 应用程序版本号// #ifdef APPme.version systemInfo.appWgtVersion;// #endif// #ifdef H5me.version systemInfo.appVersion;// #endif2.在获取到服务器保存的app版本 3.点击按钮验证版本号 //…

JS的箭头函数this:

箭头函数不会创建自己的this&#xff0c;它只会从自己的作用域链的上一层沿用this。 具体看实例&#xff1a; //以前&#xff1a;谁调用的这个函数 this就指向谁// console.log(this);//window// function fn(){// console.log(this);//window 因为这个函数也是window调用…

lwIP 细节之五:accept 回调函数是何时调用的

使用 lwIP 协议栈进行 TCP 裸机编程&#xff0c;其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数&#xff0c;注册到协议栈&#xff0c;在适当的时候&#xff0c;由协议栈自动调用&#xff0c;所以称为回调。 注&#xff1a;除非特别说明&#xff0c;以下内…

2024GoCN线下活动全面启动,赠送深圳MeetUp门票

2024年GoCN社区将全面启动一系列令人期待的线下活动---不仅将在北京、上海、深圳、武汉、成都、杭州、广州、西安等地举办 meetup&#xff0c;还将在北京和上海举办 GopherChina 大会。 2024议题征集通道已开启&#xff0c;欢迎各位有实战经验、独特观点的Gopher前来分享~ 2024…

Anaconda中使用Jupyter出现’No module named ‘pymysql‘问题解决

问题截图&#xff1a; 解决办法&#xff1a; 一.找到Anaconda所在文件夹&#xff0c;文件夹处输入 cmd 进入命令控制 二. 在打开的cmd中输入‘conda install pymysql’ 三、输入y 安装完成~ 测试&#xff1a; import pandas as pd from sqlalchemy import create_engine …

EAM系统在地铁设备管理中的应用

在现代城市的交通系统中&#xff0c;地铁作为一种高效、快速、可靠的公共交通工具&#xff0c;扮演着至关重要的角色。为了确保地铁系统的正常运行和可靠性&#xff0c;地铁管理部门需要有效地管理大量的设备和设施。在这个过程中&#xff0c;企业资产管理&#xff08;EAM&…

Python个人代码随笔(观看无益,请跳过)

异常抛错&#xff1a;一般来说&#xff0c;在程序中&#xff0c;遇到异常时&#xff0c;会从这一层逐层往外抛错&#xff0c;一直抛到最外层&#xff0c;由最外层把错误显示在用户终端。 try:raise ValueError("A value error...") except ValueError:print("V…

linux源码包管理

8.2 源码包管理 source code需要经过GC,C编译环境编译才能运行 ​ 可以设定个人设置&#xff0c;但配置复杂 ​ 软件包示例: nginx-1.8.1.tar.gz -----------------------------------------------------------------------------------------------------------------------…

知识付费小程序开发:构建个性化学习平台的技术实践

随着在线学习和知识付费的兴起&#xff0c;开发一款知识付费小程序成为了创新的热点之一。本文将通过使用Node.js、Express和MongoDB为例&#xff0c;演示如何构建一个基础的知识付费小程序后端&#xff0c;并实现用户认证和知识内容管理。 1. 初始化项目 首先&#xff0c;确…

CSS复合选择器(在基础选择器上元素选择的方式不同)

后代选择器&#xff1a; ------------ 此情况下&#xff0c;红色的可以划去 子&#xff08;元素&#xff09;选择器&#xff1a; 并集选择器&#xff1a; 伪类选择器&#xff1a; 如放上字符会变色。 链接伪类选择器&#xff1a; foucus伪类选择器&#xff1a;

matplotlib如何在label中加入字符并换行【已解决】

最近在跑一个超参数的实验&#xff0c;但是发现x轴的刻度就很丑 显然&#xff0c;lr和theta在一行显得很冗余 这个是此时的label x_labels [$\t{lr0.05}\ \tθ10}$, 40, 60] 正常加换行符即可&#xff0c;但是要加上$$ x_labels [$\t{lr0.05}\ $\n$ \tθ10}$, 40, 60] 大…

听力健康“吃”出来

大多数的研究报告都指出&#xff0c;听力下降的最常见原因是年龄和噪音暴露。然而&#xff0c;近年来越来越多的文章开始探讨其他因素对听力的影响。食物不仅是维持人类基本生存的必需品&#xff0c;随着营养学的进步&#xff0c;人们也逐渐认识到食物中的营养与保持健康之间存…

zabbix6入门到精通(3) 预处理

zabbix6入门到精通&#xff08;3&#xff09; 预处理 配置 — 主机 文件系统主项目 vfs.fs.get 测试一下 添加预处理 $[?(.fsname ‘/’)] $[0].inodes.pfree JSONPath参照&#xff1a; https://www.zabbix.com/documentation/6.0/zh/manual/config/items/preprocessi…

【halcon深度学习】目标检测的数据准备过程中的一个库函数determine_dl_model_detection_param

determine_dl_model_detection_param “determine_dl_model_detection_param” 直译为 “确定深度学习模型检测参数”。 这个过程会自动针对给定数据集估算模型的某些高级参数&#xff0c;强烈建议使用这一过程来优化训练和推断性能。 过程签名 determine_dl_model_detection…

Codeforces Round 914 (Div. 2) A~E

A.Forked!&#xff08;思维&#xff09; 题意&#xff1a; 给出骑士的跳跃能力 ( x , y ) (x, y) (x,y) 以及国王和皇后的位置&#xff0c;问有多少个位置可以让骑士可以直接攻击到国王和皇后。 分析&#xff1a; 棋盘非常大 ( 1 0 8 1 0 8 ) (10^{8} \times 10^{8}) (1…

Tomcat-指定启动jdk、修改使用的jdk版本

修改tomcat配置文件setclasspath.sh 配置文件首行增加以下代码&#xff0c;指定启动的jdk&#xff1a; export JAVA_HOME/opt/softwares/jdk1.8.0_211/ export JRE_HOME/opt/softwares/jdk1.8.0_211/jre

drf入门规范

一 Web应用模式 在开发Web应用中&#xff0c;有两种应用模式&#xff1a; 1.1 前后端不分离 1.2 前后端分离 二 API接口 为了在团队内部形成共识、防止个人习惯差异引起的混乱&#xff0c;我们需要找到一种大家都觉得很好的接口实现规范&#xff0c;而且这种规范能够让后端写…

获取和移除cookie的方法

下载npm的cookie插件, 在utils.js文件中引入插件: 封装原始的Cookies.get()方法: 在xxxx.vue文件中引入方法: 使用getCookie方法获取cookie: 封装 移除cookie: export const removeCookie name>{ const options { path: /, domain: xxx.com }; Cookies.remove(name, opti…

i春秋云镜之Tsclient

首先拿到目标:39.99.137.155 首先通过Fscan扫描目标: 可以看到扫描出来了一个SqlServer的弱口令。 账号是sa&#xff0c;密码是1qaz!QAZ。 这里就不使用navicat进行连接了&#xff0c;这里使用impacket-mssqlclient进行连接。 impacket-mssqlclient sa:1qaz!QAZ39.99.137.…