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

相关推荐
肆忆_10 小时前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星14 小时前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛2 天前
delete又未完全delete
c++
端平入洛3 天前
auto有时不auto
c++
哇哈哈20214 天前
信号量和信号
linux·c++
多恩Stone4 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马4 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost
超级大福宝4 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
weiabc4 天前
printf(“%lf“, ys) 和 cout << ys 输出的浮点数格式存在细微差异
数据结构·c++·算法
问好眼4 天前
《算法竞赛进阶指南》0x01 位运算-3.64位整数乘法
c++·算法·位运算·信息学奥赛