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

Posted linux-bfbdxj520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数指针与类成员函数指针相关的知识,希望对你有一定的参考价值。

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;

以上是关于函数指针与类成员函数指针的主要内容,如果未能解决你的问题,请参考以下文章

C++ 结构体与类指针

C++函数指针与成员函数指针

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

c++类的成员函数指针如何转为普通指针

C++之静态

C++之中this指针与类的六个默认函数小结