入表达式
λ表达式
问题的提出 ·对于下面求定积分的函数: double integrate(double (*f)(double),double a, double b); 如果要求函数x2在区间[0,1]的定积分,则一 般要先定义一个函数square: double square(double x)return x*x; 然后再把它作为参数去调用integrate: integrate(square,0,1); 如果还要再求函数x3 等一些在程序中 很少使用的简单函数的定积分呢?
问题的提出 ◼ 对于下面求定积分的函数: • double integrate(double (*f)(double),double a, double b); ◼ 如果要求函数x 2在区间[0,1]的定积分,则一 般要先定义一个函数square: • double square(double x) { return x*x; } ◼ 然后再把它作为参数去调用integrate: • integrate(square,0,1); ◼ 如果还要再求函数x 3 、......等一些在程序中 很少使用的简单函数的定积分呢?
匿名函数入表达式 对于一些临时用一下的简单函数,如果也要先给出这 个函数的定义并为之取个名字,然后再通过这个函数 的名字来使用它们,在有些场合下会给程序编写带来 不便。 C++新国际标准(C++11)为C++提供了一种匿 名函数机制-一入表达式(lambda expression), 利用它可以实现把函数的定义和使用合而为一。 例如,求函数x2在区间[0,1]的定积分: integrate([](double x)->double return x*x;},0,1); 上面黄颜色部分就是一个入表达式
匿名函数--λ表达式 ◼ 对于一些临时用一下的简单函数,如果也要先给出这 个函数的定义并为之取个名字,然后再通过这个函数 的名字来使用它们,在有些场合下会给程序编写带来 不便。 ◼ C++新国际标准(C++11)为C++提供了一种匿 名函数机制――λ表达式(lambda expression), 利用它可以实现把函数的定义和使用合而为一。 ◼ 例如,求函数x 2在区间[0,1]的定积分: integrate([](double x)->double { return x*x; },0,1); • 上面黄颜色部分就是一个λ表达式
入表达式的定义格式 ■入表达式的常用格式为: [] :指出函数的参数及类型,其格式为 ·() 如果函数没有参数,则这项可以省略。 :指出函数的返回值类型,其格式 为: -> 它可以省略,这时根据函数体中return返回的值隐式确定返 回值类型。 为六个复合语句
λ表达式的定义格式 ◼ λ表达式的常用格式为: [] ◼ :指出函数的参数及类型,其格式为: • () • 如果函数没有参数,则这项可以省略。 ◼ :指出函数的返回值类型,其格式 为: • -> • 它可以省略,这时根据函数体中return返回的值隐式确定返 回值类型。 ◼ 为一个复合语句
■:指出函数体中对外层 作用域中的自动变量的使用限制: 。空:不能使用外层作用域中的自动变量。 。&:按引用方式使用外层作用域中的自动变量(可 以改变这些变量的值) =: 按值方式使用使用外层作用域中的自动变量 (不能改变这些变量的值 &和=可以用来统一指定对外层作用域中自动变量 的使用方式,也可以用来单独指定可使用的外层自 动变量(变量名前可以加&,默认为=)
◼ :指出函数体中对外层 作用域中的自动变量的使用限制: • 空:不能使用外层作用域中的自动变量。 • &:按引用方式使用外层作用域中的自动变量(可 以改变这些变量的值)。 • =:按值方式使用使用外层作用域中的自动变量 (不能改变这些变量的值)。 • &和=可以用来统一指定对外层作用域中自动变量 的使用方式,也可以用来单独指定可使用的外层自 动变量(变量名前可以加&,默认为=)
▣下面是一些合法的入表达式 int k,m,n; .[](intx)->int{return x*x;}../不能使用k、m、n ..[&](intx)->int{k++;m++;n++ return x+k+m+n;../k、m、n可以被修改 ...[=](int x)->int return x+k+m+n;}.. /k、m、n不能被修改 [&,n](intx)->int{k++;m++; return x+k+m+n;}./n不能被修改 ...[=,&n](int x)->int n++;return x+k+m+n;}.. /n可以被修改 ...[&k,m](int x)->int k++;return x+k+m;}.. /只能使用k和m,k可以被修改 [=]{return k+m+n;.,/没有参数,返回值类型为int
◼ 下面是一些合法的λ表达式: { int k,m,n; ...... ...[](int x)->int { return x*x; }... //不能使用k、m、n ...[&](int x)->int { k++; m++; n++; return x+k+m+n; }... //k、m、n可以被修改 ...[=](int x)->int { return x+k+m+n; }... //k、m、n不能被修改 ...[&,n](int x)->int { k++; m++; return x+k+m+n; }... //n不能被修改 ...[=,&n](int x)->int { n++; return x+k+m+n; }... //n可以被修改 ...[&k,m](int x)->int { k++; return x+k+m; }... //只能使用k和m,k可以被修改 ...[=] { return k+m+n; }... //没有参数,返回值类型为int }
■入表达式通常用于把一个匿名函数作为参数 传给另一个函数的场合。 不使用环境变量的入表达式可隐式转换成函 数指针
◼ λ表达式通常用于把一个匿名函数作为参数 传给另一个函数的场合。 ◼ 不使用环境变量的λ表达式可隐式转换成函 数指针
入表达式的实现 在C++中,入表达式是通过函数对象来实现 的: 先隐式定义一个类,其中重载了函数调用操作 符,重载函数按相应的入表达式来实现。 然后创建上述类的一个对象。 最后使用该对象: ·作用于实参 cout int return x*x;}(3); 传给其它函数 f([](int x)->int return x*x;})
λ表达式的实现 ◼ 在C++中,λ表达式是通过函数对象来实现 的: • 先隐式定义一个类,其中重载了函数调用操作 符,重载函数按相应的λ表达式来实现。 • 然后创建上述类的一个对象。 • 最后使用该对象: ◼ 作用于实参 cout int { return x*x; }(3); ◼ 传给其它函数 f([](int x)->int { return x*x; });