函数指针与类成员函数指针

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\n",pf);
printf("%p\n",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\n";
}
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\n",pf);
printf("%p\n",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;
}

posted @ 2019-08-26 11:19  bfbdxj520  阅读(168)  评论(0编辑  收藏  举报