通过函数指针调用一个函数的时候,此函数必须有具体的地址,因此当调用一个类成员函数的时候,此成员函数必须声明为static,即静态成员函数,这样就能通过函数指针获取到成员函数的地址,进而调用。
关于静态成员函数:
编译器在编译一个普通成员函数时,会隐式地增加一个形参this,并把当前对象的地址赋值给this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数。
普通成员函数必须通过对象才能调用,而静态成员函数没有this指针,无法在函数体内部访问某个对象,所以不能调用普通成员函数,只能调用静态成员函数。静态成员函数与普通成员函数的根本区别在于:普通成员函数有this指针,可以访问类中的任意成员;而静态成员函数没有this指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
更多信息,可参考:C++ static静态成员函数详解
注意!
注意!
注意!
声明类成员函数为静态函数,才可以通过函数指针进行调用!!!
以下是调用类成员函数的具体实现:
#include <iostream>
using namespace std;
// 声明函数指针
typedef int(*func)(int a, int b);
// 声明一个类
class Calculate {
public:
// 声明成员函数为静态成员函数,否则在调用的时候无法获取函数地址
static int Addition(int a, int b);
static int Subtraction(int a, int b);
};
// 静态成员函数的实现
int Calculate::Addition(int a,int b)
{
return a + b;
}
// 静态成员函数的实现
int Calculate::Subtraction(int a, int b)
{
return a - b;
}
// 参数为函数指针,去调用类成员函数
void GetResult(func f)
{
cout << f(1, 2) << endl;
}
int main()
{
// 对于类静态成员函数的调用
GetResult(&Calculate::Addition);
GetResult(&Calculate::Subtraction);
return 0;
}
函数输出
3
-1
谢谢阅读