本文继上一篇文章http://www.tgwttt.xyz/?p=169

一 .lambda表达式:lambda 表达式本质是⼀个匿名函数对象,跟普通函数不同的是他可以定义在函数内部。lambda 表达式语法使⽤层⽽⾔没有类型,所以我们⼀般是⽤auto或者模板参数定义的对象去接收 lambda 对象。lambda表达式的格式: [capture-list] (parameters)-> return type {function boby} capture-list : 捕捉列表 parameters :参数列表 ->return type :返回值类型 function boby :函数体 如下面是一个简单的lambda式的例子: lambda表达式
int main(){
auto add1 = [](int x, int y)->int{
return x + y;
};
auto func1 = []
{
cout << "hello bit" << endl;
return 0;
};
func1();
} 注意: // 1、捕捉为空也不能省略
// 2、参数为空可以省略
// 3、返回值可以省略,可以通过返回对象⾃动推导
// 4、函数体不能省略 捕捉:lambda表达式的捕捉有很多种方式 传值捕捉如:[a,b](int x,int y) ,这种方式不能修改a,b的值,传入所有值[=](int x,int y) 引用捕捉如:[&a,&b](int x,int y),这种方式可以修改a,b的值 ,引用捕捉所有值[&](int x,int y)

类的新功能

1.defult和delete: defult:指定生成默认构造函数,delete:禁止使用某默认构造函数

2.final和override : final修饰类不能被继承
override 放在子类重写的地方,如果没有完成重写,则会报错

3.默认的移动构造和移动赋值 原来C++类中,有6个默认成员函数:构造函数/析构函数/拷⻉构造函数/拷⻉赋值重载/取地址重载/const 取地址重载,最后重要的是前4个,后两个⽤处不⼤,默认成员函数就是我们不写编译器会⽣成⼀个默认的。C++11 新增了两个默认成员函数,移动构造函数和移动赋值运算符重载

包装器:

function:

std::function 是⼀个类模板,也是⼀个包装器。 std::function 的实例对象可以包装存储其他的可以调⽤对象,包括函数指针、仿函数、 lambda 、 bind 表达式等,定义头⽂件中。

例如:

function f1 = f;//普通函数f(int a,int b);
function f2 = Functor();//仿函数
function f3 = [](int a, int b) {return a + b; };lambda表达式
cout << f1(1, 1) << endl;
cout << f2(1, 1) << endl;
cout << f3(1, 1) << endl;
// 包装静态成员函数
// 成员函数要指定类域并且前⾯加&才能获取地址
function f4 = &Plus::plusi;
cout << f4(1, 1) << endl;
// 包装普通成员函数
// 普通成员函数还有⼀个隐含的this指针参数,所以绑定时传对象或者对象的指针过去都可以
function f5 = &Plus::plusd;
Plus pd;
cout << f5(&pd, 1.1, 1.1) << endl;
function f6 = &Plus::plusd;
cout << f6(pd, 1.1, 1.1) << endl;
cout << f6(pd, 1.1, 1.1) << endl;
function f7 = &Plus::plusd;
cout << f7(move(pd), 1.1, 1.1) << endl;
cout << f7(Plus(), 1.1, 1.1) << endl;
                                                                                      

bind:bind 是⼀个函数模板,它也是⼀个可调⽤对象的包装器,可以把他看做⼀个函数适配器,对接收
的fn可调⽤对象进⾏处理后返回⼀个可调⽤对象。 bind 可以⽤来调整参数个数和参数顺序。
bind 也在这个头⽂件中。

它的第一个作用就是指定参数位置:如:

using placeholders::_1;
using placeholders::_2;
using placeholders::_3;
auto sub2 = bind(Sub, _2, _1);
cout << sub2(10, 5) << endl;

第二个成员函数对象进⾏绑死,就不需要每次都传递了下面是例子:

计算复利的lambda
auto func1 = [](double rate, double money, int year)->double {
	double ret = money;
	for (int i = 0; i < year; i++)
	{
		ret += ret * rate;
	} return ret - money;
	};
绑死⼀些参数,实现出⽀持不同年华利率,不同⾦额和不同年份计算出复利的结算利息
function func3_1_5 = bind(func1, 0.015, _1, 3);
function func5_1_5 = bind(func1, 0.015, _1, 5);
function func10_2_5 = bind(func1, 0.025, _1, 10);
function func20_3_5 = bind(func1, 0.035, _1, 30);
cout << func3_1_5(1000000) << endl;
cout << func5_1_5(1000000) << endl;
cout << func10_2_5(1000000) << endl;
cout << func20_3_5(1000000) << endl;

今天的更新就到这里了,如有不对欢迎评论区指出!!!