zoukankan      html  css  js  c++  java
  • 回调函数

    一、前言

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

    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

  • 相关阅读:
    基于集合成工控机Ubuntu系统安装分区详解
    MySql连接问题
    再记一个提供webServices的网址
    J​a​y​r​o​c​k​.​J​s​o​n​读​取​j​s​o​n​数​据​(​n​e​t​)
    jquery mobile页面跳转后,必须重新刷新页面js方可有效
    删除数据库失败 因为当前数据库正在使用
    如何解决自定义404页面在IE等浏览器中无法显示问题
    HTTP协议详解(真的很经典)
    如何在XAMPP中设置多个网站
    apache php 多站点配置 重新整理
  • 原文地址:https://www.cnblogs.com/aoguren/p/3354728.html
Copyright © 2011-2022 走看看