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;
}
相关文章
相关标签/搜索