服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 关于C++11中限定作用域的枚举类型的问题

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

2022-09-06 16:18余生以学 C/C++

C++中有两种类型的枚举:不限定作用域的枚举类型和限定作用域的枚举类型。限定作用域的枚举类型是C++11标准引入的新类型,对C++11中限定作用域的枚举类型相关知识感兴趣的朋友一起看看吧

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

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

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

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

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
//定义不限定作用域枚举类型
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标准中,要想初始化枚举类型对象或对枚举对象赋值,必须使用该类型的一个枚举成员或该类型的一个对象。示例代码如下所示:

?
1
2
3
4
5
6
7
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类型的枚举值

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

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

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

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

?
1
2
3
4
5
enum intvalues:unsigned long long{
  chartype = 255, shorttype = 65535, inttype = 4295967295,
  longtype = 4294967295ul,
  longlongtype = 18446744073709551615ul
};

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

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

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

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

?
1
2
3
4
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作用域枚举类型内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/2018shawn/p/15848879.html

延伸 · 阅读

精彩推荐
  • C/C++手把手带你搞懂C语言指针

    手把手带你搞懂C语言指针

    这篇文章主要介绍了C语言的指针,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下,希望能给你带来帮助...

    宝全哥哥10622021-12-23
  • C/C++C++使用jsoncpp库解析Json

    C++使用jsoncpp库解析Json

    对json的解析操作是我们日常开发中经常会遇到的一个需求,下面这篇文章主要给大家介绍了关于C++使用jsoncpp库解析Json的相关资料,需要的朋友可以参考下...

    廖先生6732021-11-11
  • C/C++如何把C++的源代码改写成C代码的方法

    如何把C++的源代码改写成C代码的方法

    这篇文章主要介绍了如何把C++的源代码改写成C代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    51CTO9262021-09-14
  • C/C++C++设计一个简单内存池的全过程

    C++设计一个简单内存池的全过程

    利用C/C++开发大型应用程序中,内存的管理与分配是一个需要认真考虑的部分,下面这篇文章主要给大家介绍了关于C++设计一个简单内存池的全过程,需要的朋...

    午饭要阳光11092022-01-10
  • C/C++C++实现LeetCode(155.最小栈)

    C++实现LeetCode(155.最小栈)

    这篇文章主要介绍了C++实现LeetCode(155.最小栈),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang7592021-12-07
  • C/C++C语言 TerminateProcess函数案例详解

    C语言 TerminateProcess函数案例详解

    这篇文章主要介绍了C语言 TerminateProcess函数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Giser_D10082021-12-20
  • C/C++C语言中二维数组作为函数参数来传递的三种方法

    C语言中二维数组作为函数参数来传递的三种方法

    这篇文章主要给大家介绍了关于C语言中二维数组作为函数参数来传递的三种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言有一定的...

    victor4982021-08-02
  • C/C++介绍C语言中tolower函数的实例

    介绍C语言中tolower函数的实例

    这篇文章主要介绍了介绍C语言中tolower函数的实例,本文列出了该函数的头文件,功能说明等,以及如何使用,以下就是详细内容,需要的朋友可以参考下...

    C语言技术网-码农有道3912021-11-21