小企业网站建设新市场报价,门户媒体是指什么,网站建设图书,长沙3合1网站建设价格C11中引入了Lambda表达式#xff0c;Lambda表达式是一种匿名函数#xff0c;它可以在需要函数的地方直接定义和使用#xff0c;而无需显式地定义一个函数。
lambda表达式
Lambda表达式语法定义
[capture-list](parameters) - return-type { statement }
capture-lis…C11中引入了Lambda表达式Lambda表达式是一种匿名函数它可以在需要函数的地方直接定义和使用而无需显式地定义一个函数。
lambda表达式
Lambda表达式语法定义
[capture-list](parameters) - return-type { statement }
capture-list是用来捕获外部变量的列表
parameters是函数的参数列表
return-type是返回值类型
statement是函数体关于capture-list的几种形式 []空的capture-list不捕获任何外部变量 [var]捕获单个变量通过值进行捕获 [var]捕获单个变量通过引用进行捕获 []通过值捕获所有外部变量 []通过引用捕获所有外部变量 [this]以值方式捕获当前对象的指针指向当前类对象的指针在成员函数内使用 使得在lambda函数内部访问成员变量和成员函数成为可能) 这些形式可以组合使用用逗号分隔。例如[x, y]表示通过值捕获变量x通过引用捕获变量y。 Lambda表达式的优缺点
优点
可以直接在需要调用函数的位置定义短小精悍的函数而不需要预先定义好函数使用Lamdba表达式变得更加紧凑结构层次更加明显、代码可读性更好
缺点
Lamdba表达式语法比较灵活增加了阅读代码的难度对于函数复用无能为力
Lambda表达式和shared_from_this()
Lambda表达式和shared_from_this()是C中两个不同的概念它们在一些情况下可以结合使用。
Lambda表达式可以在代码中直接定义匿名的、可调用的函数。Lambda函数可以捕获外部变量并且可以使用[]语法来指定捕获方式。Lambda表达式常用于替代传统的函数对象或函数指针。
shared_from_this()是一个成员函数它位于一个继承自std::enable_shared_from_this的类中。它的作用是返回一个std::shared_ptr该智能指针可以安全地管理当前对象的生命周期。
这两个概念的关系在于当我们需要在Lambda表达式中访问当前对象即Lambda表达式所在的类的实例时可以使用shared_from_this()来获取指向当前对象的std::shared_ptr。这样可以保证在Lambda表达式执行期间当前对象不会意外地被销毁从而避免悬空指针的问题。
需要注意的是使用shared_from_this()必须满足两个条件
对象必须通过std::shared_ptr来管理其生命周期。调用shared_from_this()的代码必须在对象生命周期内即不能在对象已经被释放后调用shared_from_this()。
总结起来Lambda表达式和shared_from_this()可以结合使用以确保在Lambda表达式中安全地访问当前对象。
#include memory
#include iostream
class A : public std::enable_shared_from_thisA {
public:void someFunction() {std::cout Calling someFunction() in class A std::endl;// 使用Lambda表达式调用另一个函数auto lambda [shared_this shared_from_this()]() {std::cout Calling lambda function std::endl;shared_this-anotherFunction(); // 调用类A中的另一个函数};lambda();}void anotherFunction() {std::cout Calling anotherFunction() in class A std::endl;}
};
class B {
public:void doSomething() {std::cout Calling doSomething() in class B std::endl;// 创建类A的智能指针并调用其中的函数std::shared_ptrA a std::make_sharedA();a-someFunction();}
};
int main() {B b;b.doSomething();return 0;
}