<六>指向类成员的指针

指向类成员(成员变量和成员方法)的指针

1:定义一个指针指向类的普通成员变量

示例代码1

    class Test2{

    public:
       int ma;
       static int mb;
       void f1(){cout<<"Test::void f1()"<<endl;}
       static void static_f(){
           cout<<"Test::void static_f()"<<endl;
       }
    };

    int Test2::mb=0;

    int main(){
        int *p = &Test2::ma;
        return 1;
    }
   上面 int *p = &Test2::ma; 可以这样吗?
   不可以,  编译报错 不可以将  int Test2::* 转为 int * 

    需要这样定义 
    int  Test2::*p = &Test2::ma;
    *p=30;//这样操作没有意义,因为ma是需要基于对象的,所以需要这样
 
    Test2  t;
    int  Test2::*p = &Test2::ma;
    t.*p=30;

    或者
    Test2 *pt=new Test2();
    int  Test2::*pp = &Test2::ma;
    pt->*pp=40;

    或者
    int *p3=&Test2::mb;
    *p3=50;


2:定义一个函数指针指向类的成员函数

void (*pf)() = &Test2::f1(); 编译报错

要明确的指出pf是指向Test2类中函数的函数指针,如下

void(Test2::*pf)()=&Test2::f1();

如果通过函数指针调用函数?需要依赖对象,如下
Test2  t3;
Test2  *p4=new Test2();
t3.*pf(); //*解引用

(p4->*pf)();// *解引用


3:定义函数指针指向类的静态成员方法
   
   void (*pf2)() = &Test2::static_f;
   (*pf2)();
 

完整示例代码如下

class Test2{

public:
   int ma;
   static int mb;
   void f1(){cout<<"Test::void f1()"<<this->ma<<endl;}
   static void static_f(){
       cout<<"Test::void static_f()"<< mb<<endl;
   }
   Test2(int _ma):ma(_ma){}
};

int Test2::mb=0;


int main(){

    Test2    obj1(100);
    Test2   *pObj2=new Test2(20);

    //定义指针指向 类的普通成员变量
    int Test2::*p = &Test2::ma;
    obj1.*p=1000;
    pObj2->*p=2000;

    //定义指针指向 类的 静态成员变量
    int *pStatic = &Test2::mb;
    *pStatic=9999;

    //定义函数指针 指向 类的普通成员方法
    void (Test2::*pf)()=&Test2::f1;
    (obj1.*pf)();
    (pObj2->*pf)();



    //定义函数指针 指向 类的静态方法

     void (*pf2)() = &Test2::static_f;
     (*pf2)();

    return 1;
}

posted @ 2022-11-13 21:54  Hello_Bugs  阅读(103)  评论(0编辑  收藏  举报