C++11新标基于C++编程社区的大量实践经验,并吸收了很多Boost库的特性,还对原有C++做了一些改进工作,是学习现代C++编程的基础。这里参考《C++ Primer Plus 第六版》,对一些常用的C++11新特性做一个总结:
1、统一的初始化
C++11支持对于所有的内置类型和用户定义类型使用大括号方式的初始化列表,使用初始化列表时,可以添加等号,也可以没有。
int x = {5}; // 以前只有数组可以这样初始化 double y {2.75}; int* ar = new int[4] {2,4,6,8}; classType s1(构造参数1, 构造参数2); // 传统方式创建一个classType对象 classType s2{构造参数1, 构造参数2}; // C++11方式创建一个classType对象 classType s3 = {构造参数1, 构造参数2}; // C++11方式创建一个classType对象
注意:C++11还提供了一个用于构造函数的模板类initializer_list,STL容器的构造函数就使用了这个类
2、右值引用和移动语意
传统意义的左值,指的是出现在赋值语句左边的表达式。例如:
int a = 20; // 这里的a就是一个左值
传统的C++引用都是使一个标识符关联到一个左值,所以传统的C++引用也被称为左值引用,例如:
int a = 20; int& ra = a; // 即ra是变量a的引用(或别名)
C++11新增了右值表达式,采用&&表示。和左值引用(可以关联到一个左值)类似,右值引用可以关联到一个右值。具体说:
int a = 10; int b = 20; int c = a + b; // 这里的a+b就是一个右值,以前是没有办法对a+b设置引用的 int&& r1 = a + b; // 根据C++11,r1可以关联到a+b产生的那个临时对象,a、b的值修改了,r1也不变
3、智能指针
智能指针是支撑RAII(获取资源即初始化)编程理念的重要方法。对于C++的RAII,简单的讲,就是所有在堆上分配的资源都委托一个栈对象管理。通过栈对象的自动释放,实现对上资源的自动释放,有效防止内存泄露。
C++11中的智能指针包括三种:std::unique_ptr、std::shared_ptr和std::weak_ptr。
这三种智能指针都是模板类,每个实例化的智能指针对象都是一个用于管理裸指针的栈对象。所以,智能指针对象一般都是直接定义在函数的栈上(不会使用new运算符创建),智能指针对象的内部实现一定是管理一个原始指针,且这个原始指针最终要指向堆上分配的资源。
因为智能指针重载指针运算符(-> 和 *)以返回封装的原始指针,所以,程序员可以像使用普通指针一样使用智能指针。
std::unique_ptr智能指针的创建和使用:
4、Lambda函数
5、包装器
如果理解函数指针、函数对象、(具名)Lambda函数。我们会突然发现,C++中有多种类似函数的调用形式,这些调用形式的存在对于普通程序原来讲其实无所谓,够用就行。但是对于模板化编程来说,太多的调用形式会导致使用了这些调用形式的模板被实例化多次。所以,C++11提出了将多种函数调用形式统一的包装器std::function。
所以,简单的说,std::function是对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的一个统一封装,形成一个新的统一可调用对象(std::function对象)(主要是对模板化编程很有意义)。