<六>指向類成員的指針

指向類成員(成員變數和成員方法)的指針

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;
}