1、列表初始化,对内置类型和自定义类型都可以使用列表进行初始化——一切都可以用列表初始化
不要和初始化列表混了
std::initializer_list临时对象作为函数的参数,用来接收{}括起来的的初始化列表
容器中有用initializer_list作为参数的构造函数,那么容器就支持{}列表初始化
auto在C++98里是用来声明自动存储期(其实没有多大用处)
C++11直接改变了他用法:自动类型推断——使得代码变得简介,和范围for
关键字decltype将变量的类型声明为表达式指定的类型
指针:nullptr,以前的NULL即是指针,也可以是常量0,为了更加清晰,所以引入nullptr
STL的变化:
1、新容器
2、新构造函数 initializer_list的构造
3、移动构造和移动赋值
4、右值引用版本·插入
左值引用和右值引用
左值引用:给左值区别名,左值:能够取地址的值(变量),左值不一定就在左边
右值引用:给右值取别名,右值:不能取地址:常量、表达式返回值,函数返回值,右值一定在左边
左值引用不能直接给右值取别名,因为权限会放大,加const后可以:
右值引用不能给左值取别名,除非加move转换后的左值
右值引用的作用:移动构造和移动赋值
如果SLT容器中只有常规的拷贝构造和赋值拷贝的话:
右值:
内置类型:纯右值
自定义类型:将亡值
但是如果传参过去的是&&右值引用的话,就可以用移动构造和移动拷贝(直接交换值)
移动构造,移动赋值中没有新开空间,拷贝数据,所以效率提高了。
注意右值引用后的属性是左值
函数模版:万能引用
forward完没转发
继承和多态中的final与override名感性上下文关键字
final:防止继承和防止虚函数重载
override:在派生类的函数重载中声明这是一个虚函数
模版的可变参数
C语言的时候就有可变参数:
其底层用列表(数组)实现
C++11引进了可变模版参数
编译时会进行类型推导:
list由可变参数模版而引申出的emplace_back() 插入函数
lambda表达式
之前我们要写按照特定元素排序时,sort第三个参数需要构建仿函数
仿函数:函数对象,可以像调用函数一样使用对象(对象里面重载了())
但是这样的话函数的取名是一个麻烦的事情
所以C++11引进了lambda表达式
lambda表达式的语法:
[捕捉列表](参数)->(返回值类型){函数体}
lambda表达式的底层其实也是仿函数,类名是lambda_uuid
function包装器
可以把具有返回值,参数相同的函数、仿函数、lambds表达式,包装到一个对象中
bind 绑定:调整参数顺序和个数