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;

欢迎关注我的微信公众号【数据库内核】:分享主流开源数据库和存储引擎相关技术。

标题网址
GitHubhttps://dbkernel.github.io
知乎https://www.zhihu.com/people/…
思否(SegmentFault)https://segmentfault.com/u/db…
掘金https://juejin.im/user/5e9d3e…
开源中国(oschina)https://my.oschina.net/dbkernel
博客园(cnblogs)https://www.cnblogs.com/dbkernel
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值