zoukankan      html  css  js  c++  java
  • 函数指针与类成员函数指针

    1,函数指针
    函数指针,顾名思义就是函数的指针,而指针其实就是地址,那么函数指针就是存储函数的地址,可是实际大部分时间里,我们写程序时是根本不会去考虑函数地址在哪里。我们只需要知道函数原型和函数声明就可以。但是想象一下,我们总是以为函数就应该接收参数,那么函数本身是否可以作为函数的参数呢?我做了下面的一个实验

    #include<iostream>
    #include<stdio.h>
    #include<cstring>
    using namespace std;
    typedef int (*intFun)(int,int);
    int add(int a,int b);
    int minus(int a,int b);
    int multi(int a,int b);
    int fun_choose(intFun,int,int);
    int main()
    {
    intFun pf;
    pf=add;
    printf("%p ",pf);
    printf("%p ",add);
    cout<<add(5,4)<<endl;
    cout<<pf(5,4)<<endl;
    cout<<fun_choose(add,5,4)<<endl;//函数名作为参数
    return 0;
    }
    int fun_choose(intFun fun,int a,int b)
    {
    return(*fun)(a,b);
    }
    int add(int a,int b)
    {
    return a+b;
    }

    从上面的代码中我们可以看出,函数也可以作为参数出入到一个函数中,这样对我们需要处理的一些程序就会很方便,当我们需要在A函数中调用B函数时,我们只需要通过函数指针把B函数传入A函数中即可。虽然我的确没有发现这样有啥好处,但可能就是帅吧。
    2.类成员函数指针
    下面程序是一些类成员函数指针的实现,其中我们不难发现,我们可以通过已存在的对象去调用类中相应的函数,而不需要对象本身去操作。看起来的确时挺帅的。

    #include<iostream>
    #include<stdio.h>
    #include<cstring>
    using namespace std;
    typedef int (*intFun)(int,int);
    class fun1;
    typedef int (fun1::*cFun1)(int,int);
    typedef void (*voidFun)();
    int add(int a,int b);
    int minus(int a,int b);
    int multi(int a,int b);
    int fun_choose(intFun,int,int);
    class fun1{
    public:
    static void output()
    {
    cout<<"fun1 ";
    }
    int fun2(int a,int b)
    {
    return a+b;
    }
    };
    int cFun_choose(fun1 *f1,cFun1 fun,int a,int b);
    int sFun(voidFun fun);
    int main()
    {
    fun1 f1;
    intFun pf;
    pf=add;
    fun1 f;
    printf("%p ",pf);
    printf("%p ",add);
    cout<<add(5,4)<<endl;
    cout<<pf(5,4)<<endl;
    cout<<cFun_choose(&f1,fun1::fun2,5,4)<<endl;
    sFun(fun1::output);
    return 0;
    }
    int sFun(voidFun fun)
    {
    (*fun)();
    }
    int cFun_choose(fun1 *f1,cFun1 fun,int a,int b)
    {
    return (f1->*fun)(a,b);
    }
    int cFun(voidFun fun)
    {
    (*fun)();
    return 1;
    }
    int fun_choose(intFun fun,int a,int b)
    {
    return(*fun)(a,b);
    }
    int add(int a,int b)
    {
    return a+b;
    }

  • 相关阅读:
    django-restframework频率功能、过滤功能等相关内容-87
    django-restframework认证功能等相关内容-86
    视图基类、扩展类、子类及试图集等相关内容-85
    vue框架前后端分离项目之课程接口、页面、前台等相关内容-127
    vue框架前后端分离项目之课程页面前端、课程表分析、编写及数据录入等相关内容-126
    celery的基础使用等相关内容-125
    数据库时间戳排序协议
    单节点部署OpenStack(Queens版本、DevStack)
    变量命名规范及str类型
    程序员职业生涯规划
  • 原文地址:https://www.cnblogs.com/linux-bfbdxj520/p/11411449.html
Copyright © 2011-2022 走看看