1 带有作用域的枚举 scoped-enumeration
相信大家都用过枚举量,都是不带有作用域的,在头文件中定义需要特别注意不要出现重名的情况。为了解决这种问题,c++11提供了带作用于的枚举。可以使用class EnumName定义,示例代码如下:
enum {ZERO, ONE, TWO}; enum class color {RED, BLUE, GREEN};
上面的是没有作用域的枚举定义形式,下面是带有作用域的枚举定义形式,调用带有作用域的枚举必须指定作用域,否则会编译出错。
还有一个比较大的区别就是,带有作用域的枚举量不能自动转换为int类型,而没有作用域的枚举量是可以的。
2 枚举的长度和前向声明
c++11针对枚举类型提供了声明枚举类型占用字节长度的机制,可在枚举名之后加上类型限定,代码如下:
enum CtrlType: unsigned long long {CT_0, CT_1};
同时,c++11提供了枚举的前向声明机制。如下代码:
// enum forward declaration enum InitValues: long long; // unscoped, must specify a size enum class NewColor; // default int
3 嵌套类、内部类的定义
这个部分不是c++11新加的内容,只是个人感觉比较有趣和可用的定义形式。内部类的可以仅在外部类中声明,而不需要直接给出定义式。示例代码如下:
// nested class class OuterClass { class InnerClass; }; class OuterClass::InnerClass { };
外部类OutClass有点像命名空间的性质了。
4 共用体支持包含带有构造函数的类成员
有时候使用union,会存在一个比较大的限制,所有的union成员必须没有构造函数,因为共用体不知道如何初始化和反初始化。
在c++11中允许union定义包含带有构造函数的成员,代码如下:
// union with class member union UnionTest { int a; std::string str; };
但是在使用的时候,我们必须维护union中的数据有效性,编译器依然不知道如何构造和析构union中的变量。慎用!!
5 标准库中添加tuple、支持正则表达式、支持新的随机数生成机制
tuple是对pair的扩展,支持任意数目任意类型的多元组。多数用于多个数据合成一个元素,但是又不想定义新的结构体或类的情况下。具体tuple的用于建议参考:http://www.cplusplus.com/reference/tuple/。
c++11中STL引入了随机数生成器(random-number engine)和随机数分配类(random-number distribution class),二者配合可以生成指定范围、指定类型、指定分布的随机数。
由于正则表达式,本人不是很熟悉,这里不做介绍了。有兴趣的可以阅读下c++ primer ch 17.3或者c++11标准。
附加说明
本文内容主要是关于 c++ primer 第五版的第16章到第19章中涉及c++11内容的整理。涉及枚举、共用体、嵌套类的新的用法。
所有代码都在gcc v4.8.1的版本中编译测试过,相关源码可以从我的git下载,url如下:https://git.oschina.net/Tocy/SampleCode.git,位于c++11目录下的cpp_primer_test4.cpp文件中。
根据其他资料介绍,c++11也支持线程机制,可惜c++ primer中没有介绍。后续可以参考下其他资料继续完善下。