C++-成員指針

帶着問題

  • 成員指針如何聲明函數

  • 如何將成員指針綁定到一個對象上spa

  • 成員指針的意義是什麼指針

  • 如何經過成員指針來訪問類的成員code

類的成員

  • 靜態成員(包括靜態數據成員,靜態成員函數):他們的指針是普通指針,如:
    對象

struct X{
    static int _x;
public:
    static void println( void ){ Println("HelloWorld: %d",_x); }
};

int X::_x=33;

int main( int argc,char *argv[] ){
    int *ptr=&X::_x;    /* 普通的int*指針 */
    Println("%p",ptr);
    void (*fptr)( void )=&X::println;/* 普通的函數指針 */
    fptr();
}

  • 非靜態成員(包括數據與函數),他們的指針須要特別聲明.見下編譯器

數據成員

  • 聲明的語法: 變量類型 類名::*成員指針變量名;編譯

  • 綁定的語法:成員指針變量名=&類名::成員
    class

  • 成員指針的意義:也即該成員在類對象中的偏移值,是一個編譯器便可肯定的常量.變量

  • 訪問:經過'.*'/'->*'運算符
    語法

struct X{
    int _x;
public:
    void print( void ){ Println("%d",_x); }
};

int main( int argc,char *argv[] ){
    int X::*ptr=&X::_x;

    Println("%p",ptr);    /* _x在X對象中的偏移:0 */

    X x;X *xptr=&x;
    x.*ptr=44;
    /* 經過'.*'運算符對成員指針進行訪問
     * 語法: 對象.*成員指針; */

    Println("%d",xptr->*ptr);
    /* 經過'->*'運算符對成員指針進行訪問
     * 語法: 對象指針->*成員指針; */

    return 0;
}

函數成員指針

  • 聲明: 函數返回類型 (類名::*變量名)(參數列表)

  • 綁定:變量=&類名::成員函數名

  • 意義:該函數的地址

  • 訪問:經過'.*'/'->*'運算符

struct X{
    int _x;
public:
    void print( void ){ Println("%d",_x); }
};

int main( int argc,char *argv[] ){
    void (X::*ptr)( void )=&X::print;

    X x;X *xptr=&x;
    (x.*ptr)();        /* 注意括號,'x.*ptr'要首先被括號括起 */
    (xptr->*ptr)();

    Println("%p",ptr);
    return 0;
}
相關文章
相關標籤/搜索