C++11特性(笔记二lambda,function)
目录
一.新的类功能
二. lambda
三. 包装器(function)
四.bind
一.新的类功能
1. 默认的移动构造和移动赋值
C++11 新增了两个默认成员函数,移动构造函数和移动赋值运算符重载。
如果你提供了移动构造或者移动赋值,编译器不会自动提供拷贝构造和拷贝赋值。
2. deful t和 delete
1. 如果我们提供了拷贝构造,就不会生成移动构造了,那么我们可以 使用 default关键字显示指定移动构造生成。
2. 如果能想要限制某些默认函数的生成,在C++98中,是该函数设置成private,并且只声明补丁已,这样只要其他人想要调用就会报错。在C++11中,只需在该函数声明加上=delete即可,该语法指示编译器不生成对应函数的默认版本,称=delete修饰的函数为删除函数。
3. override 和 final关键字
1. C++11提供了override,可以帮助用户检测是否重写。
2. 如果我们不想让派生类 重写 这个虚函数,那么可以用final去修饰。
二. lambda
1 .lambda 表达式本质是一个匿名函数对象,跟普通函数不同的是他可以定义在函数内部。
2. lambda 表达式语法使用层而言没有类型,所以我们 一般是用auto 或者 模板参数定义的对象 去接收 lambda 对象。
3. lambda表达式的格式: [capture-list](parameters)->return type {function boby }
[capture-list]: 捕捉列表能够 捕捉函数中的变量 供 lambda 函数使用,捕捉列表可以传值和传引用捕捉。
第一种捕捉:捕捉方式是在捕捉列表中显示的传值捕捉和传引用捕捉,捕捉的多个变量用逗号分。[x,&z]表示x和y值捕捉,z引用捕捉。
第二种捕捉:是在捕捉列表中隐式捕捉,我们在捕捉列表写一个=表示隐式值捕捉,在捕捉列表
写一个&表示隐式引用捕捉,这样我们 lambda 表达式中用了那些变量,编译器就会自动捕捉那些
变量。
第三种捕捉:是在捕捉列表中混合使用隐式捕捉和显示捕捉。第一个元素必须是&或=,当为&混合捕捉时,后面的捕捉变量 必须是 值捕捉,同理,=混合捕捉时,后面的捕捉变量必须是引用捕捉。
(parameters): 参数列表,与普通函数的参数列表功能类似,如果不需要参数传递,则可以连
同()一起省略
->return type: 返回值类型,用追踪返回类型形式声明函数的返回值类型,没有返回值时此
部分可省略。一般返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。
{function boby}: 函数体,函数体内的实现跟普通函数完全类似,在该函数体内,除了可以
使用其参数外,还可以使用所有捕获到的变量,函数体为空也不能省略。
一般模板:
捕捉列表例子1:
捕捉列表例子2:
捕捉列表例子3:
三. 包装器(function)
1. std::function 是一个类模板,也是一个包装器。 std::function 的实例对象可以包装存诸其他的可以调用对象,包括函数指针、仿函数、 lambda、 bind 表达式 等,存储的可调用对象被称为 std::function 的目标。
2. 若 std::function 不含目标,则称它为空。调用空std::function 的目标导致抛出 std::bad _ function_call 异常。
3. 函数,仿函数,lambda包装器例子:
4.类的例子:
四.bind
1. bind 是一个函数模板,它也是一个可调用对象的包装器,可以把他看做一个函数适配器,对接收的fun可调用对象进行处理后返回一个可调用对象。bind 可以用来调整参数个数和参数顺序。
2. bind 也在<functional>这个头文件中。
调换参数位置例子:原来为10-5 现在为5-10
固定参数例子: