C++-成员指针

带着问题

  • 成员指针如何声明

  • 如何将成员指针绑定到一个对象上

  • 成员指针的意义是什么

  • 如何通过成员指针来访问类的成员

类的成员

  • 静态成员(包括静态数据成员,静态成员函数):他们的指针是普通指针,如:

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

  • 非静态成员(包括数据与函数),他们的指针需要特别声明.见下

数据成员

  • 声明的语法: 变量类型 类名::*成员指针变量名;

  • 绑定的语法:成员指针变量名=&类名::成员

  • 成员指针的意义:也即该成员在类对象中的偏移值,是一个编译器即可确定的常量.

  • 访问:通过'.*'/'->*'运算符

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


转载于:https://my.oschina.net/u/1383479/blog/210799

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值