在C++11之前的枚举(enum),是没有办法两个枚举(enum)内有相同枚举名的。如果还不知道C++中枚举(enum)是什么,可以看这篇:枚举enum
如:苹果和桔子都有大,中,小。写个代码来说明下:
两枚举类型中相同枚举值
C++
1
2
enumapple{big,medium,small,special};
enumorange{big,medium,small};
以上代码编译不会通过的,因为apple和orange在同一个作用域内。之前我们可能会改成用size来做枚举,但apple枚举又多了一个枚举值,这样在C++11之前版本中就不会很好处理。
哪C++11是如何处理这类问题?
C++11提供一种新枚举(enum),其枚举量的作用域为类。
具体声明如下:
C++11作用域内枚举
C++
1
2
enumclassapple{big,medium,small,special};
enumclassorange{big,medium,small};
声明中的class关键字,也可以用struct。
C++11作用域内枚举struct
C++
1
2
enumstructapple{big,medium,small,special};
enumstructorange{big,medium,small};
这样枚举的作用域为类后,不同枚举(enum)定义中的枚举量就不会有名称冲突。
如何使用作用域内枚举?
使用枚举名来限定枚举量,这样编译器才会明白用哪个的枚举量。
使用C++11作用域内枚举量
C++
1
2
applea1=apple::big;
orangeo1=orange::big;
C++11作用域内枚举不能默认隐式转换成int
C++
1
2
3
4
5
6
7
//C++ 98
inti=a1;//正确
//C++ 11
intj=o1;//错误
intk=int(o1);//显示类型转换
上面代码可以看出C++11代码会更加安全,如一定要转换,必需显示类型转换。
为什么不能直接转换具体原因?
C++98中,枚举类的具体值类型是什么,可能随系统而异,没有硬规定。但一般都会是int类型。
C++11中,枚举类的具体值类型不在依赖系统,可以自己定义。如不指定,默认C++11作用域内枚举的值类型是int。
如何指定C++11作用域内枚举的值类型?
指定枚举值类型定义语法:
C++11指定枚举值类型定义
C++
1
2
enumclass:shortapple{big,medium,small,special};//值类型为short
enumclass:intorange{big,medium,small};/值类型为int
相关文章:自定义类型枚举enum枚举enum没有新定义类型,结构是一个新类型这点可以从它们的定义看到,枚举的每个值没有类型,只有名字,结束用“,”结构类的成员都有自己的类型,有变量名,结束用“;”。其时枚举enum是整型变量,枚举enum的定义意义,就是以Arrow类型为例,它的取值只有4个,主要还是为了编程时方便管理,方便阅读,方便理解程序。运用有非常多,如颜色枚举、季节枚举、月份枚举、星期枚举等等。...
C++11语言auto关键字作用C++11中对关键字auto进行了重新定义,可以让编译器根据初始值类型自动推断变量的类型。auto a = 0; //推断出a类型为int atuo b = 0.0; //推断出b类型doublu auto c = 'A'; //推断出c类型是char如果不知道为什么能自动推断出来可以看下:常量类型 和 C++常量类型 获取上面写的都是推断基本类型,当然C++11 auto关键字并非只样简单的运用,更多的是为了自定义类型推断。相信很多人在写迭代器时会很头痛,太长了。先个vector类型的迭代器。...
C++11新增数组初始化方式C++11之前数组使用方法可以参考这篇:数组使用注意点今天这篇主要讲C++11数组新增加初始化方式。 1.C++11数组初始化时可省略等号 2.C++11数组初始化时大括号内可以不包含任何东西 3.C++11数组初始化时不能缩窄转换。缩窄转换:就是宽类型转窄类型,例如double转int ...
C++11字符串新增初始化方式C++11除了支持之前版本的初始化方式外,还支持列表初始化方式。列表初始化可以看上篇:C++11新增数组初始化方式下面写个新增初始化方式和之前赋值方式比较:...
C++都支持哪些作用域C++语言作用域符号是两个冒号:: ,相信大家不陌生,在看代码是一定会有很多地方有这::符号。作用域,如果不理解是什么,可以先理解成起作用的范围。书上都是写作用域,这样比较书面话,如写成作用范围就不哪么好听。C++语言支持3种作用域: 1.局部作用域(local scope) 2.名字空间作用域(namespace scope) 3.类作用域(class scope) ...
C++11新增模板类array原因vector类的功能比数组强大,但效率没有数组高(vector对象分配在自由存储区或堆中)。效率来讲内置数组是最高的,但是会不安全不方便,如下标越界、两个数组赋值要用for循环一个个赋值。以上两点,C++11中就新增了array类模板,来解决内置数组不安全不方便,相比vector提高效率(array对象分配在栈中)。...
C++11新增基于范围的for循环之前在用for循环时,每次都要写条件,并不是很方法。double a[5] = {1,2,3,4,5}; for(int i=0;i...
C++11关键字decltype用途关键字decltype将变量的类型声明为表达式指定的类型。下面的语句的含义是,让y的类型与x相同,其中x是一个表达式。decltype (x) y;decltype的工作原理比auto复杂,可以指定类型为引用和const。...
C++11新增关键字nullptrnullptr关键字就是表示空指针的意思,C++11之前空指针都是NULL。已经有了NULL哪为什么还要有nullptr关键字? nullptr表示空指针,不能转换为整型类型。为了向后兼容,C++11仍允许用0(NULL)来表示空指针。建议使用nullptr而不是0(NULL),因为更高的类型安全。...
C++11两个尖括号中间可以不用加空格在之前写C++代码时,比如声明嵌套模板(vector里面存的还是vector),这时就会有两个尖括号出现。就会与运算符>>搞混,C++要求在声明嵌套模板时使用空格将尖括号分开。...