关于C++11中限定作用域的枚举类型的问题

枚举类型是将一组有限的整数常量组织在一起用以描述变量可取值范围的一种数据类型。C++中有两种类型的枚举:不限定作用域的枚举类型和限定作用域的枚举类型。限定作用域的枚举类型是C++11标准引入的新类型。

● 限定作用域枚举类型是为了弥补不限定作用域枚举类型的不足而出现的,不限定作用域的枚举类型不是类型安全的,主要表现在如下几个方面:

● 不限定作用域的枚举类型中的枚举成员被视为整数,两种不同的枚举类型之间可以进行比较。两种不同类型的数据进行比较,可能带来数据类型转换,引起数据表示不完整。

● 不限定作用域枚举所使用的整数类型及其大小都由实现方法定义,皆无法明确指定。

● 不限定作用域枚举类型的枚举成员与枚举类型外部数据处在同一个作用域范围内,多个枚举类型不能有同名的枚举成员。

C++11标准引入的限定作用域的枚举类型,其定义方式如下所示:

enum class 枚举类型名称 {枚举成员1, 枚举成员2, …, 枚举成员n};

相对于不限定作用域的枚举类型,限定作用域的枚举类型定义的枚举成员在枚举类型作用域外不可访问。

//定义不限定作用域枚举类型
enum color {red, yellow, green};
//错误,不限定作用域枚举成员不能与其它枚举类型成员同名
enum stoplight{red, yellow, green}; 

//正确,限定作用域枚举成员的作用域限定在类型内
enum class newcolor {red, yellow, green};
//正确,不限定作用域的枚举类型外可以使用枚举成员
color e_color = green;
//错误,限定作用域的枚举成员在类型外不可访问
//虽然color类型的green成员可访问,但是color与newcolor类型不同,不可赋值
newcolor ec_color = green;   

在旧标准中,枚举变量可以使用整数常量进行赋值,但在C++11标准中,要想初始化枚举类型对象或对枚举对象赋值,必须使用该类型的一个枚举成员或该类型的一个对象。示例代码如下所示:

enum color {red, yellow, green};
enum class newcolor {red, yellow, green};  

color e_var1 = 1;                 //错误,1不是枚举类型值
color e_var2 = red;                //正确,red是color类型的枚举值
color e_var3 = e_var2;             //正确,同类型数据之间的赋值
newcolor e_nvar1 = newcolor::red;       //正确,red是newcolor类型的枚举值

不限定作用域的枚举类型对象或枚举成员可以自动转化为整型,因此可以在需要整数的地方使用它们,限定作用域的枚举类型却没有此特点。示例代码如下所示:

int i = color::red;               //正确,不限定作用域的枚举成员可转化为整数
int j = newcolor::red;             //错误,限定作用域的枚举成员不可转化为整数

C++11新标准除了增加了限定作用域枚举类型外,还改进了原有的不限定作用域枚举类型的定义形式:

1、枚举类型中枚举成员的类型可以显式指定,指定方式是在枚举类型名称后加冒号和枚举成员类型。

enum intvalues:unsigned long long{
  chartype = 255, shorttype = 65535, inttype = 4295967295,
  longtype = 4294967295ul,
  longlongtype = 18446744073709551615ul
};

若不指定枚举成员类型,限定作用域枚举类型成员默认为int,不限定作用域枚举类型成员不存在默认类型,能够确定的是成员类型足够大到能容纳所有成员。指定了枚举成员类型后,若某一枚举成员值超出了该类型所能容纳的范围,将引发错误。

2、在C++11 中,可以提前声明enum。enum的前置声明必须指定枚举成员类型,隐式指定或显式指定均可。

enum etype1;              //错误,不限定作用域枚举类型的前置声明应指定成员类型
enum etype2:unsigned int;      //正确
enum class etype3;          //正确,限定作用域枚举类型成员有默认类型int
enum class etype4:unsigned int;  //正确,前置声明指定枚举成员类型

与所有的声明语句一样,枚举的声明和定义中描述的成员类型必须一致,另外不能在同一个上下文中先声明一个不限定作用域的枚举类型再声明一个同名的限定作用域枚举类型。

enmu class Clolor:char; //前置声明枚举类
void Foo(Color*p); //前置声明的使用
//....................
enum class Color:char{RED,GREEN,BLACK,WHITE}; //前置声明的定义

参考链接:

C++11强类型枚举——枚举类

限定作用域的枚举类型 - C语言学习教程_C语言程序_ c语言编程_ c语言入门

到此这篇关于C++11:限定作用域的枚举类型的文章就介绍到这了,更多相关C++11作用域枚举类型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++枚举类型用法总结(枚举字符常量代替常量)

    C++枚举类型enum表示枚举,通常用于定义个新类型的字符常量,比如enum {January,February,March}.枚举类型的作用域一般是整个文件或者类内.当枚举类型定义在文件开头时,则作用域是从定义位置开始往后(不包括函数内定义):当枚举类型在类内定义时,则作用域为整个类内.在类内的头文件定义和初始化枚举类型,当实例这个类的对象时,枚举类型不会占用空间,只是包含一个字符常量而已. 枚举类型的定义可以在整个文件夹,也可以在类内.当在整个文件夹时,所有枚举量不能有相同的.当在类内时,不

  • 浅谈C++变量作用域

    C++ 变量作用域 作用域是程序的一个区域,一般来说有三个地方可以定义变量: 在函数或一个代码块内部声明的变量,称为局部变量. 在函数参数的定义中声明的变量,称为形式参数. 在所有函数外部声明的变量,称为全局变量. 我们将在后续的章节中学习什么是函数和参数.本章我们先来讲解什么是局部变量和全局变量. 局部变量 在函数或一个代码块内部声明的变量,称为局部变量.它们只能被函数内部或者代码块内部的语句使用.下面的实例使用了局部变量: #include <iostream> using namespa

  • C++枚举类型enum与enum class的使用

    一.关于枚举类型 1. 什么是枚举类型? 答:如果一个变量只有几种可能的值,那么就可以定义为枚举类型,比如:性别只有男和女,那么就可以将性别定义为一种枚举类型,其中男和女就是性别所包含的变量.所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内.在C++中,枚举类型分为不限定作用域(enum)和限定作用域(enum class). 2. enum与enum class的区别? (为什么需要限定作用域?) 答:枚举作用域是指枚举类型成员名字的作用域,起自其声明之处,

  • 讲解C++中的枚举类型以及声明新类型的方法

    C++枚举类型 如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型.所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内.声明枚举类型用enum开头.例如: enum weekday{sun, mon, tue, wed, thu, fri, sat}; 上面声明了一个枚举类型weekday,花括号中sun, mon, -, sat等称为枚举元素或枚举常量.表示这个类型的变量的值只能是以上7个值之一.它们是用户自己定义的标识符. 声明枚举类

  • 详解C++作用域与生命周期

    Pascal之父Nicklaus Wirth曾经提出一个公式,展示出了程序的本质:程序=算法+数据结构.后人又给出一个公式与之遥相呼应:软件=程序+文档.这两个公式可以简洁明了的为我们展示程序和软件的组成. 程序的运行过程可以理解为算法对数据的加工过程,程序的运行的结果,就是算法加工数据产生的结果数据.算法描述的是对数据加工的步骤,对应于程序中的函数.数据结构描述的是数据在计算机中的组织结构,对应于程序中的数据类型.程序中数据对应的就是无处不在变量.对于我们编程人员,面对的无非就是函数,数据类型

  • 关于C++11中限定作用域的枚举类型的问题

    枚举类型是将一组有限的整数常量组织在一起用以描述变量可取值范围的一种数据类型.C++中有两种类型的枚举:不限定作用域的枚举类型和限定作用域的枚举类型.限定作用域的枚举类型是C++11标准引入的新类型. ● 限定作用域枚举类型是为了弥补不限定作用域枚举类型的不足而出现的,不限定作用域的枚举类型不是类型安全的,主要表现在如下几个方面: ● 不限定作用域的枚举类型中的枚举成员被视为整数,两种不同的枚举类型之间可以进行比较.两种不同类型的数据进行比较,可能带来数据类型转换,引起数据表示不完整. ● 不限

  • JSP 中Hibernate实现映射枚举类型

    JSP 中Hibernate实现映射枚举类型 问题: Java BO类Gender是枚举类型,想在数据库中存成字符串格式,如何编写hbm.xml? public enum Gender{ UNKNOWN("Unknown"), MALE("Male"), FEMALE("Female"); private String key; private Gender(final String key) { this.key = key; } public

  • 扒一扒 Java 中的枚举类型

    前言 在 Java 中, 枚举, 也称为枚举类型, 其是一种特殊的数据类型, 它使得变量能够称为一组预定义的常量. 其目的是强制编译时类型安全. 枚举类更加直观,类型安全.使用常量会有以下几个缺陷: 1. 类型不安全.若一个方法中要求传入季节这个参数,用常量的话,形参就是int类型,开发者传入任意类型的int类型值就行,但是如果是枚举类型的话,就只能传入枚举类中包含的对象. 2. 没有命名空间.开发者要在命名的时候以SEASON_开头,这样另外一个开发者再看这段代码的时候,才知道这四个常量分别代

  • Java枚举类型与泛型使用解读

    目录 一.枚举类型 1.使用枚举类型设置常量 2.枚举类型常用方法 3.枚举类型中的构造方法 二.泛型 1.泛型的常规用法 2.泛型的高级用法 总结 一.枚举类型 1.使用枚举类型设置常量 以往设置常量,通常将常量放置在接口中,这样在程序中就可以直接使用,并且该常量不能被修改,因为在接口中定义常量时,该常量的修饰符为final与static. 常规定义常量的代码如下所示. 例:在接口中定义常量的常规方式 public interface Constants{ public static fina

  • Java的枚举类型使用方法详解

    1.背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用public final static 方法定义的代码如下,分别用1 表示春天,2表示夏天,3表示秋天,4表示冬天. public class Season { public static final int SPRING = 1; public static final int SUMMER = 2; public static final int AUTUMN = 3; publ

  • JavaScript enum枚举类型定义及使用方法

    enum型也被成为枚举类型,它是一种可以将多个常量分组为一个并附加一系列值的类型,使用枚举定义的常量称为枚举器列表,默认情况下,枚举器从零开始按顺序编号.本篇文章给大家介绍关于JavaScript中枚举类型的使用. JavaScript中enum(枚举类型)是什么? JavaScript中是没有枚举类型的,除了JavaScript以外的语言都有enum这个关键词,但为了在JavaScript中使用枚举变量,我们必须自己创建它. 下面我们就来看如何在JavaScript中定义enum(枚举类型)

  • springboot枚举类型传递的步骤

    目录 测试 Converter 灵活化 在本周写项目时,需要将枚举类型作为参数进行传递. 测试 首先先建立一个枚举类: public enum ScoreType { TOTAL_SCORE("总评成绩"), MIDDLE_SCORE("期中成绩"), FINAL_SCORE("期末成绩"); String des; // 描述 ScoreType(String des) { this.des = des; } public String get

  • SpringBoot 枚举类型的自动转换的实现

    目录 1.请求头接收参数 2.请求体接收 3.添加自定义枚举序列化 需求:一般我们在数据库都会定义数值型的枚举常量,不管是序列化还是反序列化都是需要我们手动去转换成枚举类型的,既然这样我们能不能让它们自动转换呢?接下来我们就来尝试一下: 首先解决如何接收枚举类型. 枚举父类 /** * @author rookie */ public interface IEnum<T extends Serializable> { /** * 获取值 * @return 值 */ T getValue();

  • C++11 中的override详解

    目录 1 公有继承 1.1 纯虚函数 (pure virtual) 1.2 普通虚函数 1.2.1 方法一 1.2.2 方法二 1.3 非虚函数 2 重写 (override) 小结: 参考资料 1 公有继承 公有继承包含两部分:一是"函数接口" (interface),二是"函数实现" (implementation) 如 Shape 类中,三个成员函数,对应三种继承方式: class Shape { public: virtual void Draw() con

  • 详解JavaScript的AngularJS框架中的作用域与数据绑定

    AngularJS 简介 AngularJS 是由 Google 发起的一款开源的前端 MVC 脚本框架,既适合做普通 WEB 应用也可以做 SPA(单页面应用,所有的用户操作都在一个页面中完成).与同为 MVC 框架的 Dojo 的定位不同,AngularJS 在功能上更加轻量,而相比于 jQuery,AngularJS 又帮您省去了许多机械的绑定工作.在一些对开发速度要求高,功能模块不需要太丰富的非企业级 WEB 应用上,AngularJS 是一个非常好的选择.AngularJS 最为复杂同

随机推荐