在了解指向类成员函数指针之前,我们先来看一下什么是函数指针。
函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。
函数指针有两个用途:一个是用来调用函数,一个是用作函数的参数。
首先来看一下“指向函数的指针”如何使用?#include <cstdio>
void print(char *str);
void print(char *str)
{
printf("%s\n", str);
}
int main()
{
char str[] = { "Hello World" };
void(*point_to_print)(char *str); //声明一个指向print的指针
point_to_print = &print; //指针的赋值
(*point_to_print)(str);
return 0;
}
这里之所将*point_to_print用括号括起来是因为 * 的算符优先级小于(),这样就会变为* (point_to_print()),会报出下面这样的错误。
class A
{
public:
void speak(char *);
};
void A::speak(char *str)
{
printf("Hello world");
}
int main()
{
A a;
void (A::*point_to_speak)(char *str); //指针的申明
point_to_speak = &A::speak; //指针的赋值
(a.*point_to_speak)("lll");
return 0;
}
除了像这样申明一个指向类成员函数的指针
void (A::*point_to_speak)(char *str);
还能用typedef来申明具体做法如下:
typedef void(A::*point_to_speak)(char *);
在C++11中还可以使用using来申明
using fun_t = void (A::*)(char *);
fun_t pmf;
pmf = &A::speak;
与typedef相比,using后面总是立即跟随新的标识符,之后使用类似赋值的语法,把现有的类型赋值新类型。
在上述代码中fun_t相当于 void (A::*)(char *)的别名,和用typedef定义的point_to_speak等价。