1、auto — 自动类型推导
auto只是一个占位符,编译期间会被真正的类型所替代。
- auto的限制:1)auto必须对变量进行初始化;2)不能作为函数参数;3)不能作用于类的非静态成员变量;4)不能用于定义数组;5)不能作用于模板参数。
- auto的应用:1)定义迭代器; 2)用于泛型编程。
2、 decltype — 自动类型推导
关键字decltype 用于在编译期间进行自动类型推导。
auto varname = value; //auto根据右边的初始值value推到出变量类型
decltype(exp) varname = value; //decltype根据表达式exp推导出变量类型
3、返回值类型后置
4、左值/右值引用
左值:在内存有确定的存储地址,有变量名,表达式结束后依旧存在的值——非临时对象
右值:在内存没有确定的地址,没有变量名,表达式结束就会销毁的值——临时对象
总结:非常量左值只能绑定左值;常量左值既可绑定左值,也可绑定右值。
移动语义:
完美转发:
5、tuple元组
6、lambda匿名函数
[外部变量访问方式说明符] (参数) mutable noexcept/throw() -> 返回值类型
外部变量格式 | 功能 |
---|---|
[] | 不导入任何外部变量 |
[=] | 以值传递导入所有外部变量 |
[&] | 以引用传递导入所有变量 |
[val1,val2,...] | 以值传递导入val1、val2等指定变量,不分先后次序 |
[&val1, &val2,...] | 以引用传递导入val1、val2等指定变量,不分先后次序 |
[val1, &val2,...] | val1值传递,val2引用传递 |
[=,&val1, ...] | 除val1以引用传递导入外,其它变量都以值传递方式导入 |
[this] | 以值传递方式导入当前的this指针 |
//没有任何功能的lambda匿名函数
[]{}
//一个简单的lambda匿名函数
[](int x){cout<<x<<endl};
7、基于范围的for循环
vector<int>vec{1,3,7,0};
//只遍历,不修改
for(auto i : vec)
{
cout << i << endl;
}
//边遍历,边修改:引用
for(auto &i : vec)
{
i = i + 2;
cout << i << endl;
}
8、constexpr—常量表达式
9、move() — 实现移动语义
move(arg) : 将左值对象arg强制转化为右值,用于实现移动语义。
10、nullptr — 初始化空类型指针
11、智能指针
unique_ptr : 独占所有权;可以允许移动所有权,而不是进行复制或复制操作。
shared_ptr: 共享所有权;底层是采用引用计数的方式实现
weak_ptr: 用于解决 shared_ptr 循环引用问题
在使用 shared_ptr 时,容易出现循环引用的问题,即两个对象互相引用,导致它们的计数器无法降为 0,从而导致内存泄漏。
weak_ptr 仅仅是一个指向 shared_ptr 对象的弱引用, 不会增加引用计数。