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

相关推荐
茉莉玫瑰花茶6 分钟前
C++扩展 --- 并发支持库(补充3)
开发语言·c++
半桔24 分钟前
【网络编程】TCP 粘包处理:手动序列化反序列化与报头封装的完整方案
linux·网络·c++·网络协议·tcp/ip
GUIQU.3 小时前
【QT】嵌入式开发:从零开始,让硬件“活”起来的魔法之旅
java·数据库·c++·qt
西阳未落6 小时前
C++基础(21)——内存管理
开发语言·c++·面试
超级大福宝7 小时前
使用 LLVM 16.0.4 编译 MiBench 中的 patricia遇到的 rpc 库问题
c语言·c++
wangjialelele7 小时前
Linux中的线程
java·linux·jvm·c++
hsjkdhs8 小时前
万字详解C++之构造函数析构函数
开发语言·c++
SELSL9 小时前
SQLite3的API调用实战例子
linux·数据库·c++·sqlite3·sqlite实战
什么半岛铁盒9 小时前
C++项目:仿muduo库高并发服务器-------Channel模块实现
linux·服务器·数据库·c++·mysql·ubuntu
闭着眼睛学算法10 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od