C++類成員指針(指向類成員的指針)


1、指向類的數據成員的指針:

   聲明格式如下:

   <類型說明符> <類名>::* <指針變量名>;

2、指向類的成員函數的指針:

   聲明格式如下:
   <類型說明符> (<類名>::*<指針名>)(<參數表>);
如:

class A
{
private:
    int a;
public:
    int c;
public:
    A(int i)
    { 
        a = i;
    };
    
    int Fun(int b) 
    { 
        return ((a * c) + b); 
    };
};

 

定義一個指向類A的數據成員c的指針,其格式如下:

int A::* pc = &(A::c);

 

定義一個指向類A的成員函數Fun()的指針,其格式如下:

int (A::*pFun)(int) = A::fun;
或
int A::*pFun(int);
pFun = A::fun;

 

由於類不是運行時存在的對象,所以在使用這類指針的時候,要定義類的一個對象,然后通過這個對象來訪問這類指針所指向的成員;
如: 

A a;
a.*pc = 8;    //為對象a的數據成員c賦值8;
A* pa;
pa = &a;
pa->*pc = 9;  //通過指向對象的指針來為指向對象成員的指針所指向的數據成員賦值;

其中,運算符".*"和"->*"都是通過指向類成員的指針來操作對象成員的運算符;

3.指向普通函數的指針的定義格式:

<類型說明符> (*<指向函數的指針名>)(<參數表>);

賦值:

<指向函數的指針名> = <函數名>;

調用:

(*<指向函數的指針名>)(<實參表>);

例如:

class B
{
    private:
        int a;
    public:
        int c;
    public:
        A(int i) { a = i;};
        int Fun(int b) { return ((a * c) + b); };
};
int main(int argc, char** argv)
{
    B x(8)
    int B::* pc = NULL;     //聲明指向類數據成員的指針pc;
    pc = &(A::c);           //為指向類數據成員的指針pc賦值;
    x.*pc = 9;              //通過指向類數據成員的指針pc為對象的成員賦值;
  
    int (B::*pFun)(int);    //聲明指向類成員函數的指針pFun;
    pFun = A::Fun;          //為指向類成員函數的指針pFun賦值為A::Fun;
  
    A* px = &x;             //聲明指向類的對象x的指針px;
    cout << (px->*pFun)(5); //通過指向對象x的指針px來訪問指向對象x的成員函數的指針pFun,並調用指向對象的成員函數指針所指向的成員函數;
    return 0;
}

-------------------------------------------------------------------------------------------------

自理解指向類數據成員的指針的結合性:

<類型說明符> (<類名>::*) <指針名> = &(<類名>::<數據成員名>)
int (A::*) pc = &(A::c);

(<類型說明符> <類名>::)* <指針名> = &(<類名>::<數據成員名>)
(int A::)* pc = &(A::c);

(<類型說明符> <類名>::) (*<指針名>) = &(<類名>::<數據成員名>)
(int A::) (*pc) = &(A::c);
可以把(*pc)作為整體,看作是對類A的數據成員c的引用,或者是 (*pc)<==>c;
即: (*<指針名>) <==> <數據成員名>

所以, A::(*pc) <==> A::c;

自理解指向類成員函數的指針的結合性:

<類型說明符> (<類名>::*<指針名>)(<參數表>) = <類名>::<成員函數名>;
int (A::*pFun)(int) = A::Fun;

<類型說明符> <類名>::*<指針名>(<參數表>) = <類名>::<成員函數名>;
int A::*pFun(int) = A::Fun;

<類型說明符> <類名>::(*<指針名>)(<參數表>) = <類名>::<成員函數名>;
int A::(*pFun)(int) = A::Fun;
可以把(*pFun)作為整體,看作是類A的成員函數名Fun;
即: (*pFun) <==> Fun;
所以,A::(*pFun) <==> A::Fun;

 


專欄:

微信公眾號 - MySQL數據庫技術:

知乎 - 數據庫技術 專欄:
https://zhuanlan.zhihu.com/mysqldb


博客:

思否/segmentfault:
https://segmentfault.com/u/dbtech

開源中國/oschina:
https://my.oschina.net/dbtech

掘金:
https://juejin.im/user/5e9d3ed251882538083fed1f/posts

博客園/cnblogs:
https://www.cnblogs.com/dbtech 
  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM