回调函数

一、前言

最近在看代码,写代码的人很喜欢用回调函数和函数指针。一直觉得回调函数和函数指针挺神秘的,所以查了一些资料,来与大家一起来分享。

1、什么是回调函数

     简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

2、为什么要使用回调函数

      因为使用回调函数可以把调用者和被调用者分开,调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。

3、如何使用回调函数

   使用回调函数,我们需要做三件事:

  • 声明
  • 定义
  • 设置触发条件:在你的函数种把你的回调函数名称转化为地址作为一个参数,以便于系统调用。

     声明和定义时应注意,回调函数由系统调用,所以可以认为它属于windows系统,不要把它当作你的某个类的成员函数。

    回调函数是一个程序员不能显示调用的函数,通过将回调函数的地址传给调用者从而实现调用。回调函数是十分必要的,在我们想通过一个统一接口实现不同的内容,这时回调函数非常合适。

二、例子

1、函数的声明

对回调函数有了一个初步的了解,下面我们来说一下函数指针。因为要实现回调,必须首先定义函数指针。

void (*) ()

左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和右边圆括弧中的入口参数

为函数指针声明类型定义:

Typedef void(* pfv)()

pfv 是一个函数指针,它指向的函数没有输入参数,返回类型为void。使用这个类型定义名称可以隐藏负责的函数指针语法。

2、函数的定义

void func()
{
   cout << "func执行" << endl;
}

这里的函数定义,函数的返回值类型以及形参类型必须与声明的一致,但是函数的功能可以不同。

3、设置触发条件

void callback(pfv p)
{
   cout << "callback running!" << endl;
   p();
}

三、代码实现

#include <iostream>
using namespace std;
 
/*-------------- 不带参数的函数 -------------*/
// 函数声明
    typedef void (*pfv)();
// 函数的定义
    void func()
    {
        cout << "func is running!" << endl;
    }
    void func1()
    {
        cout << "func1 is running!" << endl;
    }
// 设置触发条件
    void callback(pfv p)
    {
        cout << "callback is running!" << endl;
        p();
        cout << "-------------------------" << endl;
    }
/*---------------带参数的函数-----------------*/
// 函数声明
    typedef void (*pF)(int);
// 函数的定义
    void fun(int x)
    {
        cout << "fun: " << x << endl;
    }
    void test(int x)
    {
        cout << "test: " << x << endl;
    }
// 设置触发条件
    void callbackc(pF p, int x)
    {
        cout << "callbackc is running!" << endl;
        p(x);
        cout << "-------------------------" << endl;
    }
int main()
{
    /*------ 不带参数--------*/
    pfv p1 = func;
    callback(p1);
 
    p1 = func1;
    callback(p1);
    /*------- 带参数---------*/
    pF p2 = fun;
    int x = 3;
    callbackc(p2,x);
 
    p2 = test;
    x = 4;
    callbackc(p2,x);
    return 0;
}

参考:http://www.cppblog.com/SpringSnow/archive/2008/12/07/68770.aspx

        http://my.oschina.net/kaixindewo/blog/16320

转载于:https://www.cnblogs.com/aoguren/p/3354728.html

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值