通过函数指针调用类成员函数的方法

通过函数指针调用一个函数的时候,此函数必须有具体的地址,因此当调用一个类成员函数的时候,此成员函数必须声明为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

谢谢阅读

猜你喜欢

转载自blog.csdn.net/weixin_43869898/article/details/109844806
今日推荐