- 构成C的基本单位:函数;构成C++的基本单位:类
- C++11新特性
- auto跟decltype:用于使编译器在编译阶段就能够推理出数据类型
auto func = [](int a, int b){
return max(a,b);}; //用lambda表达式赋值给函数指针
const int& a = 1;
decltype(a) b = 2; //b为const int&类型
- 引入了右值引用
左值:可以取地址且有名字的东西(字符串字面值“abcd”也属于左值)
右值:不能取地址且没有名字的东西(包括纯右值和将亡值)
纯右值:运算表达式产生的临时变量、不和对象关联的原始字面量(即除字符串字面值之外的字面值)、非引用返回的临时变量、lambda表达式等都是纯右值。
将亡值:通常指将要被移动的对象、T&&函数的返回值、std::move函数的返回值、转换为T&&类型转换函数的返回值,将亡值可以理解为即将要销毁的值,通过“盗取”其它变量内存空间方式获取的值,在确保其它变量不再被使用或者即将被销毁时,可以避免内存空间的释放和分配,延长变量值的生命周期,常用来完成移动构造或者移动赋值的特殊任务。
class A {
xxx;
};
A a;
auto c = std::move(a); // c是将亡值(a后面不会再被使用了,没必要复制,直接move)
auto d = static_cast<A&&>(a); // d是将亡值
左值引用:对左值进行引用的类型
int a = 1;
int& b = a; //对的,b为1,相当于b是a的别名(这个b可以修改,改完a也会跟着变)
const int& b = 1; //对的,b为1,相当于b是1的别名(这个b不能修改,因为const)
int& b = 1; //error,非常量引用的初始值必须为左值
右值引用:对右值进行引用的类型
int a = 4;
int &&b = a; // error, a是左值
int &&c = std::move(a); // ok
左值引用和右值引用都不具有堆存,仅仅是某块内存的别名,所以声明的时候就需要立刻初始化了。
移动语义:转移资源的所有权,对应于某块资源,转为自己所拥有,别人不再拥有也不会再使用。多用std::move()来实现
返回值优化:当函数需要返回一个对象实例时,就会创建一个临时对象并通过赋值构造函数将目标对象复制到临时对象,这里复制构造函数和析构函数会被多余地调用。(也就是不再构造临时对象,直接把构造好的对象给函数返回值赋值的那个对象)
3. 列表初始化:C++11允许直接在变量名后面使用列表来初始化变量
int i{
1};
int i = {
1};
int a[3] = {
1