C++中类成员函数指针使用方法

1. 指向类非静态成员的函数指针

声明: 指向类的成员函数的指针需要在指针前面加上类的类型,格式为:

typedef 返回值 (类名::*指针类型名)(参数列表);

赋值: 需要用类的成员函数地址赋值,格式为:

指针类型名  指针名 = &类名::成员函数名;

注意:赋值时&符号必须要加:不加&编译器会认为是在调用类的成员函数,所以需要给出参数列表,否则会报错;加&编译器才认为是要获取函数指针。

调用: 调用类对象.*; 调用类指针->*,格式为:

类对象: (类对象.*指针名)(参数列表);

类指针: (类指针->*指针名)(参数列表);

代码示例:

#include 
#include 

using namespace std;

class MathCalculation
{
public:
    int add(int a,int b) //非静态函数
    { 
        return  a + b;
    }
};

typedef int (MathCalculation::*FuncCal)(int,int);

int main()
{
    FuncCal funAdd = &MathCalculation::add;
    MathCalculation * calPtr = new MathCalculation;
    int ret1 = (calPtr->*funAdd)(1,2);  //指针调用

    MathCalculation cal;
    int ret2 = (cal.*funAdd)(3,4);  //对象调用

    cout << "ret1 = " << ret1 << endl;
    cout << "ret2 = " << ret2 << endl;
    return 0;
}

2. 指向类静态成员的函数指针

类的静态成员函数和普通函数的函数指针的区别在于,他们是不依赖于具体对象的,所有实例化的对象都共享同一个静态成员,所以静态成员也没有this指针的概念。指向类的静态成员的指针就是普通的指针。非static的member function存在this指针,调用时需要传入该对象的地址,成员函数操作的是对象的数据。

#include 
#include 

using namespace std;

class MathCalculation
{
public:
    static int add(int a,int b) //静态函数
    { 
        return  a + b;
    }
};

typedef int (*FuncCal)(int,int);

int main()
{
    FuncCal funAdd = &MathCalculation::add;
    MathCalculation * calPtr = new MathCalculation;
    int ret1 = (*funAdd)(1,2);
    int ret2 = funAdd(3,3);

    cout << "ret1 = " << ret1 << endl;
    cout << "ret2 = " << ret2 << endl;

    return 0;
}

综上所述:

  • 类的静态成员函数,使用函数指针和普通函数指针无区别
  • 类的非静态成员函数,使用函数指针需要加类限制

你可能感兴趣的:(编程学c++,c++,开发语言,后端)