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 函数的核心优势在于它们的匿名性和对外部变量 的捕获能力,而内联函数则主要关注于提高小型函数的性能。

相关推荐
qq_433554543 分钟前
C++ list代码练习、set基础概念、set对象创建、set大小操作
开发语言·c++·list
AI+程序员在路上19 分钟前
单元测试与QTestLib框架使用
开发语言·c++·单元测试
比特森林探险记32 分钟前
Go 中的 Map 与字符处理指南
c++·算法·golang
whoarethenext40 分钟前
使用 C/C++ 和 OpenCV 实现滑动条控制图像旋转
c语言·c++·opencv
whoarethenext1 小时前
使用 OpenCV (C++) 进行人脸边缘提取
c++·人工智能·opencv
Code_流苏2 小时前
C++课设:智能优惠快餐点餐系统
开发语言·c++·课设·期末大作业·快餐点餐系统·智能优惠算法
越城3 小时前
深入解析C++引用:从别名机制到函数特性实践
c++
qwertyuiop_i3 小时前
pe文件结构(TLS)
c++·tls·pe文件结构
岁忧4 小时前
(nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)
java·c++·算法·leetcode·职场和发展·go
无敌的小笼包4 小时前
第四讲:类和对象(下)
数据结构·c++