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;
    }

  • 相关阅读:
    Mybaits 的优点
    mybatis中#{}和${}的区别
    springmvc工作流程
    request对象的主要方法有哪些
    如何决定选用HashMap还是TreeMap?
    队列和栈是什么,列出它们的区别?
    fail-fast与fail-safe有什么区别?
    Collections类是什么?
    哪些集合类提供对元素的随机访问?
    可以作为GC Roots的对象包括哪些
  • 原文地址:https://www.cnblogs.com/linux-bfbdxj520/p/11411449.html
Copyright © 2011-2022 走看看