本章主要讲:
移动语义和右值引用
Lambda表达式
包装器模板function
可变参数模板
1.C++11新类型
long long
unsigned long long
char16_t
char32_t
2.扩大初始化列表的适用范围
3.声明
auto 自动类型识别
decltype 将类型声明为表达式指定的类型: decltype(x) y;//y是x的类型
模板类别名 using ITType= xxxx;效果跟typedef xxxx ittype;差不多,但是模板类别名可以用于部分具体化,typedef不行
nullptr
4.只能指针 unique_ptr、shared_ptr和weak_ptr
5.异常,新增noexpect声明不会引发异常
6.枚举,新增了class和struct定义
enum class New1{xxx1,xx2,xx3};
enum struct New2{xxx1,xx2,xx3};
7.类
explicit 显式
类定义的时候初始化成员变量
8.模板
基于范围的for循环 for(auto x : xxx)
新增STL容器forward_list/unorderd_map/unordered_multimap/unorder_set/unorder_multiset
新增了模板array
cbegin()和cend(),crbegin()和crend()
9右值引用,使用&&来表示,主要是用于移动语义
10.移动语义,是为了直接使用临时产生的原始数据
需要一个复制构造函数,一个移动构造函数
class cn
{
cn(const cn& );
cn(cn&& );//函数里面将指针的内容直接拿来用了,不再new,有点像浅复制
}
右值引用和移动语义带来的好处,主要是在实现了这些的库代码
11.强制移动
使用头文件utility的move()函数,可以进行强制移动,即使对方是左值
cn a;
cn b = move(a);
move()只是将a变成右值,还需要cn这个类有移动赋值运算符,否则,使用普通的复制赋值运算符,是不能进行强制移动的。
12.委托构造函数
在构造函数初始化列表中使用其他构造函数。可以少写代码
13.继承构造函数
可以直接使用父类的构造函数而不需自己去写一堆了。
14.override可以声明覆盖父类的函数,如果特征标不同,编译器会报错
如果不想父类函数被覆盖,可以使用final。
15.lambda表达式
匿名函数
使用[]代替函数名,没有返回类型,跟decltype类似。
16.包装器wrapper,也叫适配器adapter。
好吧,留作以后用到的时候再研究了。
17.可变参数模板
template<typename T, typename... args>
void f(T value, args... a)
{
}
args是一个模板参数包
函数里面要使用递归。
18.C++的其他新增功能
并行编程
新增库
低级编程