首页 > 编程语言 > 详细

C++中的函数指针

时间:2014-01-29 00:35:44      阅读:471      评论:0      收藏:0      [点我收藏+]

1.函数指针的定义方式如下:

<返回类型>  (*<指针名>)  (<形参列表>)

比如定义了一个函数指针为  int (*p) (int x);

p表示一个函数指针,它指向接受一个int型形参的函数,这个函数的返回类型为int .

这里要注意的是它不能写成 int *p(int x),这时p不再是函数指针,而是一个函数名,它接受int类型形参,返回类型为指向int类型的指针

 

如果用typedef定义简化函数指针定义,可用

typedef  int (*p) (int x);

p p1;

这样就可以定义函数指针p1.,这样做的好处在于,如果要定义多个函数指针,这样可以更加简便。

2.函数指针的调用

假如有函数int f(int x);

定义函数指针为  int (*p)(int x);

函数f的调用方式有以下三种

a=f(1);    //函数名调用

a=(*p)(1);   //使用指针的间接访问操作

a=p(1);     //间接访问并不是必须的

下面是调用函数指针的代码:

# include <iostream>
using namespace std;
# include <stdlib.h>
int main()
{
int f(int x);
int (*p)(int x);
p=f;
cout<<p(4)<<endl;
cout<<f(4)<<endl;
cout<<(*p)(4)<<endl;   //函数指针的调用方式
system("pause");
return 0;
}
int f(int x)
{
return x*x;
}


 

需要注意的是,上面使用了 int f(4)p(4)(*p)(4)的调用方式,也可以使用int (*f)(4)的形式,效果与以上结果完全相同,这也说明了函数名实际上函数的入口地址,在将入口地址赋值给函数指针的时候,用p=&fp=f的效果完全相同。

3.函数指针的用途

这里介绍函数指针用于跳转表,以简化代码

假设要编写程序,实现四种操作,分别是0.上移,1.下移,2.左移,3.右移,可以采用switch case的结构,

int x;

switch (c)

{

case  0:

up(x);break;

case  1:

down(x);break;

case  2:

left(x);break;

case 3:

right(x);break;

}

如果操作增加,比如有一百种操作,这个switch  case结构将会很庞大,可以用跳转表简化这段代码,这里需要用函数指针数组。

首先声明这四个函数, void up(int x);

                     void down(int x);

                     void  left(int x);

                     void   right(int x);

定义函数指针数组 void (*p[ ])={up,down,left,right};

这样,如果是调用up函数,只要用p[0](int x);

下面是实现的代码:

# include <iostream>
using namespace std;
# include <stdlib.h>
int main()
{
void up(int x);
void down(int x);
void left(int x);
void right(int x);
void (*p[])(int x)={up,down,left,right};   //定义函数指针数组,分别指向四个函数
cout<<"input the operation:"<<endl;
cout<<"0:up"<<endl;
cout<<"1:down"<<endl;
cout<<"2:left"<<endl;
cout<<"3:right"<<endl;
int c;
cin>>c;
cout<<"input the distance"<<endl;
int x;
cin>>x;
p[c](x);
system("pause");
return 0;
}

void up(int x)
{
cout<<x<<" meters up"<<endl;
}

void down(int x)
{
cout<<x<<" meters down"<<endl;
}

void left(int x)
{
cout<<x<<" meters left"<<endl;
}

void right(int x)
{
cout<<x<<" meters right"<<endl;
}


 

从以上的例子可以看出,跳转表大大简化了代码量,替换了switch case结构,这是函数指针的强大功能。

 

2.成员函数指针

类中成员函数也可以定义函数指针,方式如下:<返回类型>   (<类名>::*<指针名>) 如:

int (A::* p) (); 它定义了一个成员函数指针p,p指向的函数形参表为空,返回值为int型。

成员函数的使用方式为,假设aA类型的对象,a.get()或(a.*p.get()都可以调用函数get(),如果*aA类型的对象,a->get();(a->*p)()都可以调用函数get()

下面是代码:

# include <iostream>
using namespace std;
class A
{
public:
A(int i):x(i){}
int get(){return x;}
private:
int x;
};
int main()
{
A a(1);
int (A::*p) ();
p=&A::get;
a.get();
(a.*p)();   //成员函数指针调用方式
A *b=&a;
b->get();
(b->*p)();
cin.get();
return 0;
}


 

C++中的函数指针

原文:http://blog.csdn.net/u011608357/article/details/18840551

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!