C++ 回调函数和Lambda表达式

目录

回调函数

[Lambda 表达式](#Lambda 表达式)

捕获列表


回调函数

回调函数(Callback Function)是一种被作为参数传递给其他函数的函数,其核心思想是允许函数在特定事件发生时执行预先定义好的操作。在 C++ 中,回调函数通常通过函数指针或函数对象实现。

回调函数的工作机制

函数指针作为参数:

函数指针定义了函数的签名(参数类型和返回值)。

通过函数指针,函数可以在运行时动态调用其他函数。

回调的触发时机:

主函数在特定条件下(如事件发生、数据处理完成等)调用回调函数。

回调函数的具体实现由调用者决定,实现了代码的灵活性和可扩展性。

cpp 复制代码
#include <iostream>

using namespace std;

bool compare(int a,int b){
    return a>b;
}

int getMax(int a,int b,bool(*p1)(int a,int b)){

    if(p1(a,b)) return a;
    else return b;
}

int main()
{
    int x=5,y=6;
    
    //bool (*p)(int a,int b)=compare;
    cout<<getMax(x,y,compare)<<endl;

    return 0;
}

compare 是一个回调函数,定义了比较逻辑。

getMax 的第三个参数 bool(*p1)(int a, int b) 是一个函数指针,指向返回值为 bool、接受两个 int 参数的函数。

在 main 中,compare 函数被作为参数传递给 getMax,实现了自定义比较逻辑。

Lambda 表达式

Lambda 表达式是 C++11 引入的一种匿名函数的方式,它允许你在需要函数的地方内联地定义函数,而 无需单独命名函数

cpp 复制代码
[capture clause](parameters) -> return_type {
 // 函数体
// 可以使用捕获列表中的变量
return expression; // 可选的返回语句
}

Lambda 表达式由以下部分组成:

捕获列表(Capture clause):用于捕获外部变量,在 Lambda 表达式中可以访问这些变量。捕 获列表可以为空,也可以包含变量列表 [var1, var2, ...]。

参数列表(Parameters):与普通函数的参数列表类似,可以为空或包含参数列表 param2, ...)。 (param1, 返回类型(Return type):Lambda 表达式可以自动推断返回类型auto,也可以显式指定返回类 型 > return_type。如果函数体只有一条返回语句,可以省略返回类型。

函数体(Body):Lambda 表达式的函数体,包含需要执行的代码。 Lambda 表达式最简单的案例是在需要一个小型函数或临时函数时直接使用它。

cpp 复制代码
#include <iostream>

using namespace std;


int add(int a,int b){
    return a+b;
}
int main()
{
    auto add2=[](int a,int b)->int{
        return a+b;
    };

    cout<<add(1,2)<<endl;
    cout<<add2(3,4)<<endl;
    return 0;
}

捕获列表

捕获列表=表示捕获所有外部变量,但不可写,只有捕获列表&,可读可写

cpp 复制代码
#include <iostream>

using namespace std;



int main()
{
    int x=30;
    int y=10;
    int z=5;

    //1.add 是一个包含捕获值(x 和 y)的函数对象
    auto add=[x,y]()->int{
        return x+y;
    };

    auto mul=[x,y]()->int{
        return x*y;
    };

    //2.捕获列表里面写=表示捕获所有外部变量 不可写
    auto sub=[=]()->int{
        return x-y-z;
    };


    //3.用引用的方式捕获,引用类似指针,进行地址访问 可读可写
    auto modifyAndMul=[&]()->int{
        x=15;
        return x*y*z;
    };


    cout<<add()<<endl;
    cout<<mul()<<endl;
    cout<<sub()<<endl;
    cout<<modifyAndMul()<<endl;
    return 0;
}

请注意,虽然 Lambda 函数和内联函数在某些方面有相似之处,如它们都可以被编译器优化以减少调用 开销,但它们在设计和用途上有明显的不同。Lambda 函数的核心优势在于它们的匿名性和对外部变量 的捕获能力,而内联函数则主要关注于提高小型函数的性能。

相关推荐
招摇的一半月亮16 分钟前
P2242 公路维修问题
数据结构·c++·算法
f***01931 小时前
CC++链接数据库(MySQL)超级详细指南
c语言·数据库·c++
合方圆~小文1 小时前
球型摄像机作为现代监控系统的核心设备
java·数据库·c++·人工智能
椰萝Yerosius2 小时前
[题解]2024CCPC郑州站——Z-order Curve
c++·算法
滨HI05 小时前
C++ opencv简化轮廓
开发语言·c++·opencv
学习路上_write6 小时前
FREERTOS_互斥量_创建和使用
c语言·开发语言·c++·stm32·单片机·嵌入式硬件
闻缺陷则喜何志丹7 小时前
【SOSDP模板 容斥原理 逆向思考】3757. 有效子序列的数量|分数未知
c++·算法·力扣·容斥原理·sosdp·逆向思考
BestOrNothing_20157 小时前
一篇搞懂 C++ 重载:函数重载 + 运算符重载,从入门到会用(含 ++、<<、== 实战)
c++·函数重载·运算符重载·operator·前置后置++·重载与重写
2501_941144427 小时前
Python + C++ 异构微服务设计与优化
c++·python·微服务
程序猿编码8 小时前
PRINCE算法的密码生成器:原理与设计思路(C/C++代码实现)
c语言·网络·c++·算法·安全·prince