一、移动语义和右值引用
移动语义避免了移动原始数据,只是修改了记录。要实现移动语义,需要采取某种方式让编译器知道什么时候需要复制,什么时候不需要复制。
虽然使用右值引用可以支持移动语义,但这并不会神气地发生,要让移动语义发生,需要两个步骤,首先右值引用让编译器知道何时使用移动语义,接着编写移动构造函数实现所需要行为。
强制转换。移动构造函数和移动赋值运算符使用右值,如果要让它们使用左值,可以使用static_cast<>()将对象类型强制转换为右值,但C++的头文件utility中声明的函数std::move()。
二、新的类功能
特殊的成员函数。C++有6个特殊的成员函数,分别是默认构造函数、赋值构造函数、复制构造函数、析构函数、移动构造函数、移动赋值函数。
默认的方法和禁用的方法。我们可以通过使用关键字default和delete指定我们要使用某个默认函数和禁用某个函数,其中默认函数只能指定特殊的6个,而禁用可以用在任何函数。
继承构造函数。C++11提供了一种让派生类能够继承基类构造函数的机制。通过在继承类中使用using语句,继承类可以使用基类的构造函数,但不会使用与派生类特征标匹配的构造函数。
管理虚方法。虚方法对实现多态类层次结构很重要,在c++11中我们可以使用虚说明符override指出我们想覆盖的一个虚函数(将其放在参数列表的后面),如果声明与基类方法不匹配,编译器将视为错误。说明符final解决了另一个问题,我们可以使用其禁止派生类覆盖特定的虚方法。
三、Lambda函数
lambda函数类似于无函数名的函数,且其没有返回值,返回值根据返回类型自动确定,类似于使用decltype。l为什么会使用ambda函数呢,下面我们从距离、简洁、效率和功能几个方面来探讨。
- 从距离来说,让函数定义位于使用的附近很有用,我们可以很方便的了解函数,并且便于修改。而函数是最糟糕的选择,因为它不能在函数内部定义其它函数,因此函数定义可能离使用它的地方很远。函数符是不错的选择,因为可以在函数内部定义类,因此函数定义离使用地方可以很近。
- 从简洁角度看,函数符比函数和lambda代码更繁琐,函数和lambda简洁程度相当。
- 从效率来说。这3种方法取决于编译器内联额那些东西,函数指针方法阻止了内联,因为函数地址的概念意味着非内联函数,而函数符和lambda通常不会阻止内联。
- lambda有一些额外的功能,它可以访问作用域内任何动态变量。
四、包装器
c++提供了多个包装器(适配器),这些对象提供给其他编程接口更一致或更合适的接口。C++11提供了很多包装器,包括模板bind、mem_fn和reference_wrapper以及function。
五、可变参数模板
可变模板让我们可以创建可变数量参数的模板函数和模板类。要创建可变参数模板需要理解几个要点:
- 模板参数包
- 函数参数包
- 展开参数包
- 递归
C++提供了一个用省略号表示的运算符,让我们可以声明表示模板参数的标识符,模板参数包相当于一个类型列表,同样我们也可以用其声明表示函数参数包的标识符,函数参数包相当于一个值列表。其语法如下:
template<typename...Args> //Args is a template parameter pack
void show_list(Args... args) //args is a function parameter pack
{
...
}
Args 和T一样都是类型匹配,不同的是T只能进行一种类型匹配,而Args可以与任意数量的类型匹配。
展开参数包。我们如何访问包里的内容呢?我们可以将省略号放在函数参数包名的右边将参数包解开。
在可变参数模板函数中使用递归。正确地使用递归为访问参数包提供了解决方案。我们可以将函数参数包解开,对列表中第一项进行处理,再将余下的内容传递给递归调用,直到列表内容为空。
六、C++11新增的其他功能
- 并行编程:为了提高计算机的性能,增加处理器数量比提高处理器速度更容易,这让计算机可以同时执行多个线程。但是有些操作可以受益于多线程也有些不能,为了解决并行问题,C++定义了一个支持线程化执行的内存模型,添加了关键字thread_local,提供了相关的库的支持。thread_local将变量声明为静态存储,其持续性与特定线程相关,即定义的这种变量的线程过期,变量也将过期。
- C++11新增了许多库,头文件random提供了比rand()复杂的随机数工具,包括选择随机发生器和随机分布状态;头文件chrono提供了处理时间间隔的途径;头文件tuple支持模板tuple,它是广义的pair对象,能够存储任意多个类型的不同值;头文件ratio支持编译阶段有理数算数库;头文件regex支持正则表达式库。
- 低级编程:这里的“低级”指抽象程度,意味着接近于计算机硬件和机器语言,这对于嵌入式编程和改善操作效率而言很重要。