C++中类的成员变量和成员函数的指针

430 阅读2分钟

C++中类的成员变量和成员函数的指针该怎么表示呢?我们知道,普通的变量指针和函数指针可以用下面的方式表示。

typedef int (*commonFunc)();
typedef int *commonVar;

上面定义了一个函数指针和一个变量指针,都是int型,函数无参数。对于C++的类成员变量和成员函数,其实也很类似,只是多了一个类的属性,测试代码如下。

#include <iostream>
using namespace std;

typedef int (*commonFunc)();
typedef int *commonVar;

int comFunc(){
    return 100;
}

class Test{
public:
    Test() {}
    Test(int a, int b):m_a(a),m_b(b){}
    ~Test() {}
    int geta(){return m_a;}
    int getb(){return m_b;}
public: //用public属性主要是为了下面测试成员变量指针的方便
    int m_a;
    int m_b;
};

typedef int (Test::*MemberFunc)();	//定义一个成员函数指针类型
typedef int Test::*Member;		    //定义一个成员变量指针类型
//对比上面定义普通函数指针和普通变量指针,它们的形式很相似,只是多了一个类作用域

int main(){
    /**
     * 普通函数指针
    */
    commonFunc pcommon = &comFunc; //等价于“commonFunc pcommon = comFunc;”,为了和成员函数指针表示形式一致,建议采用加&这种方式

    cout << "1 - common function: " << (*pcommon)() << endl;  //等价于下面这一行,为了和成员函数指针表示形式一致,建议采用加*这种方式
    cout << "2 - common function: " << pcommon() << endl;

    /**
     * 普通变量指针
    */
    int i = 90;
    commonVar pi = &i;
    cout << "common var i = " << *pi << endl;
    
    /**
     * 成员函数指针测试
    */
    Test t(1,2);
    MemberFunc pa = &Test::geta;
    cout << "t.a = " << (t.*pa)() << endl;	//“t.”表示绑定到一个对象,因为成员函数默认有一个隐含的this指针

    Test* p = new Test(10,11);
    cout << "p->a = " << (p->*pa)() << endl;//“p->”表示绑定到一个指针,这个指针也就是成员函数默认的隐含this指针

    /**
     * 成员变量指针测试
    */
    Member pm = &Test::m_a;
    cout << "t.a = " << t.*pm << endl;

    return 0;
}

成员函数有一个非成员函数不具有的属性-它的类(class)。指向成员函数的指针必须和为其赋值的函数类型匹配,需要满足三方面的要求(普通函数指针只需要满足前两个要求):(1)参数类型和个数;(2)返回类型 ;(3) 它所属的类类型。

函数指针存储函数的地址,可以被用来直接调用那个函数。成员函数指针首先必须被绑定到一个对象或者一个指针上(得到被调用对象的this 指针),然后才能调 用指针所指的成员函数。