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

关于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作用域枚举类型内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    作用域设置|设置作用域选项

    作用域设置|设置作用域选项,,1. 设置作用域选项xp只能加入域,不能建立域,xp不是服务器的操作系统2. 作用域选项和服务器选项有什么区别域英

    Laravel 的 ORM 返回的数据类型小结

    Laravel 的 ORM 返回的数据类型小结,的是,方法, 相信很多人在学习 Laravel 时,会对 ORM 返回的数据类型产生混淆,如返回集合,模或者整数类型

    抽象数据类型有哪些

    抽象数据类型有哪些,描述,数据,抽象数据类型,操作,抽象,对象,抽象数据类型是一种对“数据结构”的描述,这种描述是“抽象”的,描述内容有:1、数据

    java八大数据类型是什么

    java八大数据类型是什么,类型,数据,方法,基本类型,转换,包装类,八大数据类型:1、byte(位),最大存储数据量是255;2、short(短整数),最大数据存储量是6553

    八种基本数据类型分别是什么

    八种基本数据类型分别是什么,类型,微软雅黑,字符,溢出,运算,进制,八种基本数据类型分别是:1、4种整数类型(byte、short、int、long);2、2种浮点类型

    Java中的枚举类型

    Java中的枚举类型,枚举类型,常量,枚举,集合,方法,名称,Java是一种面向对象的编程语言,提供了丰富的语法和内置类型。Java中的枚举类型是一种特殊

    java基本数据类型有哪些

    java基本数据类型有哪些,默认值,数据,基本数据类型,验证,输出,长整数,Java的基本数据类型有8种,分别是:byte(位)、short(短整数)、int(整数)、long(长整

    数据库数据类型有哪些

    数据库数据类型有哪些,类型,字符串,数据,二进制,日期,文本,MySQL中定义数据字段的类型对你数据库的优化是非常重要的。  MySQL支持多种类型,大

    八种基本数据类型分别是什么?

    八种基本数据类型分别是什么?,包装类,二进制,基本类型,最小值,补码,类型,八种基本数据类型为:1、byte型,8位、有符号的以二进制补码表示的整数;2、s

    数据类型有哪几种

    数据类型有哪几种,类型,字符,浮点数,数据,后缀,字面量,数据类型有:1、整数类型【byte、short、int、long】;2、浮点数类型【float、double】;3、字

    1.JS中数据类型(number,细节)

    1.JS中数据类型(number,细节),转换为,类型,number正数、负数、零、小数......NaN:not a number 不是一个有效数字,但是属于 number 类型NaN 和

    PostgreSQL中date数据类型

    PostgreSQL中date数据类型,是指,数据类型,highgo=# create table test_aa (c1 date);CREATE TABLEhighgo=# insert into test_aa values (

    ASP数据类型

    ASP数据类型,表示,数字,ASP只有一种数据类型那就是"variant "。它是一种特殊的数据类型能够根据它的使用表示很多不同种类的信息。因为