C++的回调函数

一、简介

本文主要介绍C++中如何使用回调函数。

二、回调函数介绍

回调函数主要在”回”字,和正常的函数调用方式不太一样。正常的函数由开发者自己定义返回类型以及传入的参数,并且也是由开发者自己调用,而回调函数功能其实也是由开发者自己实现,但是返回类型以及入参则由注册回调的函数来决定(若是自己编写则可以自定义注册函数,由他人提供则只能根据接口实现),而且调用方也不是开发者,而是注册方决定。

整个过程也就是一个”回”字,开发者将自己的函数指针交给对方,这是”去”,而对方则在适当的时候调用这个函数,也可以将一些开发者需要的数据传回来,这便是来回了。

总而言之,正常情况是开发者调用API,调用权在开发者手中,而回调函数则相当于API调用开发者提供的函数,主被动转换了。

三、回调函数用处

那么,回调函数的用处是什么呢?既然发明了回调函数,自然是有其用武之地了。

如果你对上面的解释比较理解的话,你就会发现回调函数真的用的很多,比如事件,其底层就是回调函数,比如最简单的UI窗口鼠标点击事件,是否是由开发者编写函数具体实现,而调用的时机是由UI框架决定呢?不过很多开发者可能由于框架封装的十分简单易用,所以没有察觉到。

四、回调函数示例

了解了概念后,我们自然是要学习如何自己实现回调函数的注册了。本文以C++为例。

void sample(void (*callback)())

{

callback();

}

void callbackFun1()

{

std::cout << “call the function1” << std::endl;

}

void callbackFun2()

{

std::cout << “call the function2” << std::endl;

}

int main()

{

sample(callbackFun1);

sample(callbackFun2);

std::system(“pause”);

return 0;

}

C++的回调函数

如上所示,这便是最简单的回调函数了。

sample函数的入参为void (callback) (),共有三部分,void 表示返回类型,(callback)为函数指针,() 则代表回调函数的入参,此处无入参。

因此只要是返回类型为void,参数为空的函数,sample都能够调用。

一般为了方便调用,都会使用typedef,如下。

typedef int (*myFun) (int&, int);

int sample(myFun mF, int& a, int b)
{
    b = 2;
    return mF(a, b);
}

int callbackFun1(int& a, int b)
{
    a++;
    return a+b;
}

int main()
{
    int a = 0;
    int b = 1;
    int c = sample(callbackFun1, a, b);

    std::cout << "a = " << a << "  b = " << b << "  c = " << c << std::endl;

    std::system("pause");

    return 0;
}

C++的回调函数

结果是否和你计算的一样呢?

以上都是直接触发,但是大部分框架可就复杂多了,可不是这么简单的调用,只会在需要的时候才会触发!

typedef int (*myFun) (int&, int);

struct fun
{
    myFun mF;
    int a;
    int b;

    fun(myFun _mF, int _a, int _b)
    {
        mF = _mF;
        a = _a;
        b = _b;
    }
};

std::vector funs;

void regisiterCallback(myFun mF, int& a, int b)
{
    funs.emplace_back(fun(mF, a, b));
}

int callbackFun1(int& a, int b)
{
    return a+b;
}

int main()
{
    int a = 0;
    int b = 0;
    regisiterCallback(callbackFun1, a, b);

    a++;
    b++;
    regisiterCallback(callbackFun1, a, b);

    std::cout << funs[1].mF(funs[1].a, funs[1].b) << std::endl;
    std::cout << funs[0].mF(funs[0].a, funs[0].b) << std::endl;

    std::system("pause");

    return 0;
}

C++的回调函数

如上regisiter函数只是负责注册回调,并没有触发回调函数,在main中才真正调用,并且我特意先调用了第二个注册的回调,结果也是先输出了第二个注册的回调,因此回调函数的调用先后顺序与注册顺序没有关系,只跟注册方实际调用顺序有关。

五、总结

本文内容为我个人之谈,如有错误,欢迎指正!

Original: https://www.cnblogs.com/Clark-Zhang/p/16687560.html
Author: 朔月の流光
Title: C++的回调函数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/712697/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • VMware及win10虚拟机的安装及环境配置

    一、安装VMware 1.1、下载VMware安装包 在此给大家一个迅雷的链接:点击下载提取码:sp84 1.2、点击下一步 1.3、点击我接受,点击下一步 1.4、更换安装位置,…

    技术杂谈 2023年6月21日
    088
  • ucoreOS_lab 1~8 实验报告导航

    所有的实验已经全部完成,实验的源代码及报告都在 Github 上,欢迎大家批评指正,如果觉得对你有帮助的话,欢迎为此项目 star & watch & fork 三…

    技术杂谈 2023年5月31日
    094
  • 什么是GUI?

    图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。 图形用户界面是一种人与计算机通信的界面显…

    技术杂谈 2023年5月31日
    088
  • 继承中的初始化和加载

    继承关系中的执行顺序代码 package onjava8.extend; /** * &#x7EE7;&#x627F;&#x5173;&#x7CFB…

    技术杂谈 2023年7月25日
    071
  • nand

    nand flash裸机编程第001节_NAND_FLASH操作原理第002节_NandFlash时序及初始化第003节_NandFlash的芯片id读取第004节_NandFla…

    技术杂谈 2023年6月21日
    081
  • synchronized

    线程锁 1.1synchronized的认识 1.1.1synchronized的介绍 在多线程并发编程中,synchronized关键字是重量级锁的代名词。但是,随着JDK的发展…

    技术杂谈 2023年6月21日
    0100
  • 博客园配置Metaweblog访问令牌

    如何配置Metaweblog访问令牌?如何通过访问令牌登录博客园? 最近博客园升级了 Metaweblog访问令牌 ,发布博客时 使用密码不能发布了; 如何更新呢? 进入后台 设置…

    技术杂谈 2023年5月31日
    0116
  • OAuth2.0基本知识

    前置知识 关注客户端开发者的简易性 通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户 允许第三方应用代表用户获得访问的权限 为Web应用、桌面应用、手机和起居室设…

    技术杂谈 2023年6月21日
    0102
  • 视频直播技术大全、直播架构、技术原理和实现思路方案整理(转)

    直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通讯等技术…

    技术杂谈 2023年5月31日
    0101
  • 2020 年你读过的书中,印象最深刻的 3 本是什么

    《过得刚好》、《真希望我父母读过这本书》、《CSS世界》。 这是亚马逊 kindle 发起的一个话题活动。我把自己的留言在博客中也记录一下。 从这本书了解了郭德纲。当年反对郭德纲的…

    技术杂谈 2023年7月10日
    078
  • Core Animation学习总结

    文件夹: The Layer Beneath2. The Layer Tree(图层树) The Backing Image(寄宿层) Layer Geometry(图层几何学) …

    技术杂谈 2023年5月31日
    089
  • 《重构:改善既有代码的设计》 读书笔记 第二章

    第二章 重构的原则 2.1 何谓重构 重构分为了动词和名词两种意义。 重构(名词):对软件内部结构的一种调整,目的是不改变软件可观察行为的前提下,提高其可理解性,降低修改成本。 (…

    技术杂谈 2023年6月1日
    084
  • MySQL数据库-数据表(二)

    分析:给 reader 表添加数据. INSERT INTO:插入数据,插入数据的时候会检查主键或者唯一索引,如果出现重复就会报错; 语法:INSERT INTO table_na…

    技术杂谈 2023年6月21日
    097
  • 深度学习研究生第一年之际,前来谈谈自己的感受

    前言 在即将结束研究生第一年之际,前来谈谈自己的感受。 你可以把这篇文章当做深度学习者、程序员、研究生的简短自白。可能会有点啰嗦,会有点无趣。但如果有时间、感兴趣,不妨阅读阅读,或…

    技术杂谈 2023年7月11日
    082
  • 自己动手写线程池——向JDK线程池进发

    自己动手写线程池——向JDK线程池进发 前言 在前面的文章自己动手写乞丐版线程池中,我们写了一个非常简单的线程池实现,这个只是一个非常简单的实现,在本篇文章当中我们将要实现一个和J…

    技术杂谈 2023年7月23日
    085
  • Vim使用技巧(持续更新)

    好记性不如烂笔头,在这里记录一些Vim使用技巧 vim配置 "&#x62F7;&#x8D1D;&#x540C;&#x6B65;&#…

    技术杂谈 2023年6月21日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球