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

  • 相关阅读:
    [Java][Android][Process] 分享 Process 运行命令行封装类型
    UVA 11992
    2014扬声器的信息中国建筑师大会
    POJ 1745 Divisibility (线性dp)
    ListView 实现多选/无线电
    UVa 11587
    zoj 2156
    [TroubleShooting] The server network address can not be reached or does not exist
    oracle,如何查看视图结构,获得视图中的字段名称、字段类型、字段长度等。
    实现文件上传,以及表单提交成功的回调函数
  • 原文地址:https://www.cnblogs.com/linux-bfbdxj520/p/11411449.html
Copyright © 2011-2022 走看看