1、函数指针
函数指针:即可以指向函数地址的指针,经常被用作函数参数,作为回调函数使用。
既然是函数指针,那么肯定与普通函数有关联的,即返回值以及函数的参数列表与普通函数一致。
假设我们构造一个a+b返回c的一个函数,我们对此构造一个指向他的函数指针。
int sum(int a,int b)
{
return a + b;
}
// 指向sum的函数指针
int (*pfunc)(int, int) = ∑
为了方便起见,我们会将函数指针构造成一个函数指针的类型。
// 构造一个类型为pfunc_ptr的函数指针类型
typedef int (*pfunc_ptr)(int, int);
// 指向一个函数
pfunc_ptr ptr = ∑ // 不用&也是可以的
测试例子
#include "stdfax.h"
/*
global function
*/
int sum(int a,int b)
{
return a + b;
}
int pro(int a, int b)
{
return a * b;
}
double half(double d)
{
return d / 2.0;
}
double twice(double d)
{
return d * 2.0;
}
extern void start_test();
void test_global_func()
{
//int sum(int, int);
//int pro(int, int);
int (*pfunc)(int, int) = ∑
pfunc = &pro; // this is the proper way of function assignment
pfunc = pro; // this is allowed
//double half(double);
//double twice(double);
// dfunc is called function pointer variable
double (*dfunc)(double) = ?
dfunc = twice;
cout << dfunc(10) << endl;
typedef int intg_t;
intg_t a = 5;
double(*pd)(double);
pd = ?
typedef double (*pdptr_t)(double);
pdptr_t pdd = &twice;
pdd = half;
}
int main()
{
int (*pfunc_ptr)(int a, int b);
pfunc_ptr = ∑
int a = pfunc_ptr(1, 2);
std::cout << "a = " << a << endl;
pfunc_ptr = &pro;
int d = pfunc_ptr(3, 4);
std::cout << "d = " << d << std::endl;
start_test();
return 0;
}
2、成员函数指针
成员函数指针与函数指针有一些区别,函数指针构造的函数是全局区域的,而成员函数指针构造的函数是属于类作用域的。
我们可以仿照函数指针来构建成员函数指针。
int (Vector::*pmemfunc_ptr)(int , int );
pmemfunc_ptr = &Vector::sum; // 必须使用取地址符
// 调用的时候必须使用类成员变量来调用
Vector vec;
int ret = (vec.*pmemfunc_ptr)(3,4); // 调用成员函数指针所指向的函数sum
测试例子
#include "stdfax.h"
class Vector
{
public:
int sum(int a, int b);
int pro(int a, int b);
};
// Vector::sum means that "sum belongs to vector"
int Vector::sum(int a, int b)
{
return a + b;
}
int Vector::pro(int a, int b)
{
return a * b;
}
void start_test()
{
// member function pointer valiable
int (Vector::*pmemfunc_ptr)(int a, int b);
pmemfunc_ptr = &Vector::sum;
Vector v;
int a = (v.*pmemfunc_ptr)(1, 2);
cout << "a = " << a << endl;
pmemfunc_ptr = &Vector::pro;
int d = (v.*pmemfunc_ptr)(3, 4);
cout << "d = " << d << endl;
}