C++11新特性总结
C++11 已经过去十年了
C++11相对C++03带来的改进主要包括核心语言以及标准库扩充两方面
核心语言
语言现代化简洁化
类型推导
auto : 自动类型推导,本质是类型修饰符,常用于声明迭代器类型,滥用会导致代码可读性下降
delctype : 是一个类型推导的运算符,常用于模板实例化时返回值类型推导
模板细节改进
连续两个右尖括号:之前会与右移运算符冲突(新标准前已被一些编译器修复)
模板别名:using 可以完全替代typedef, 且改善之前typedef 和模板配合不好的问题
函数模板默认参数:C++03 只有类模板允许有默认参数,C++11 函数模板也支持默认参数
列表初始化
以初始化一个vector 为例
//c++03
vector<int> v;
v.push_back(2);
v.push_back(3);
v.push_back(5);
//c++11
vector<int> v = {2, 3, 5};
foreach loop
以遍历一个vector为例
//c++03
vector<int> v;
for (inst i = 0; i < v.size(); i++)
{
}
//c++11
for (int a : v)
{
}
std::function 以及bind
std::function : c++ 可调用对象包括函数指针,函数对象,可被转化为函数指针的类对象, std::function 将这些可调用对象统一包装起来
bind: 将可调用对象与函数参数对象进行绑定。可以用于将不同函数转化为同一函数签名(用于线程池)
lambda 表达式
函数声明变的简洁
方便配合标准库
实现功能闭包
tuple 元组
pair 只能支持两个元素,tuple 支持多个元素
提升程序性能
右值引用和移动构造
右值引用:右值引用解决了左值引用无法传递临时对象和常引用对象。右值引用允许传递一个可变的临时对象引用。主要配合移动构造。
移动构造:使用移动而非复制语义完成构造过程,主要用于解决从函数返回值时的大量深拷贝开销。使用右值引用和移动构造,在按值传递和返回临时对象时,即可免去不必要的内存分配和数据拷贝开销
move: 将左值转化为右值
forward以及完美转发:一个右值引用的参数,在函数内部转发该参数的时候,这个参数变为左值。所谓完美转发是指在函数模板中,完全依照模板的参数类型将参数传递给函数调用的另一个函数
语言改进
成员默认初始值
class A
{
int a = 1;
int b = 2;
};
override 和final
override : 用于标识指定的虚方法重载了基类中的同名虚方法。该修饰符导致编译时严格检查。避免因函数签名不同而重载失败
final: 用于修饰类或方案,修饰类时表示这个类不能被继承,修饰方法时表示此虚方法已经是最终实现
nullptr
严格代表空指针, 解决了NULL 在int 型以及 指针型参数的函数重载异议的问题
Enum class
强枚举类型杜绝了不同枚举类型之间的比较或枚举与整形之间的比较,能够在编译时发现更多错误
模板不定长参数
为模板方法提供了类似普通函数的可变数量参数(…)支持,可极大地方便一些特殊模板的构建,例如:用于实现智能指针模板类中的“operator->*()”(成员指针解引用)操作,以及一些类似于“printf”的模板方法。
新字符串类型
C++11 中新增了 char16_t 和 char32_t 两中类型,用以应对 wchar_t 位宽不确定的问题。又新增了 UTF-8(u8)、UTF-16(u)和 UTF-32(U)字符串字面值定义方法。
thread_local
增加线程本地存储,不必使用编译器提供的thread_local
显示默认和禁用构造方法
C++11 中,用户可以通过“= default”后缀修饰符,为每个类显式指定默认构造函数。也可以通过“= delete”后缀修饰构造函数和赋值等操作(通常用来实现禁止复制的语义)。增加代码可读性。
static_assert
assert是运行时检测,static_assert 用于模板实例化时检测
标准库扩充
容器
为容器新增移动构造函数以及在容器中新增元素的移动版本,emplace,emplace_back
新增hash 型容器,unordered_map, unodered_set
新增算法
all_of, any_of, none_of
find_if_not
copy_if
max_element, min_element
is_sorted, is_sorted_until
线程支持
新标准库提供了线程,互斥量,条件变量,原子量以及内存屏障的实现
正则表达式
新的标准库支持正则搜索和替换
智能指针
unique_ptr : 保证指针对对象的唯一绑定,只能通过移动语义交换所有权
shared_ptr: 使用一个原子变量进行引用计数,计数为0时销毁对象,在多线程情况下拷贝会增加新能损耗
weak_ptr: 辅助shared_ptr 使用,解决shared_ptr 循环引用问题,也用于观察者模式
随机数生成器
新标准库提供了右值伪随机数生成器
时间库
新标准库提供时间库chrono,支持设置地区时区