C++箭头操作符重载(记录下,备忘)

最近由于工作,学习了下箭头操作符,好复杂的说,过了没几天就忘了,又学了一遍。

同时决定,这里记录下,备忘!

(这里的内容,参考了C++primer ,加上了些我自己的整理)

箭头操作符,一般都有左右两部分:a->b;(其中,b可以是函数或者成员;)

如何开始:由a开始,分下面两种情况

1、a是指针,那么就是我们熟悉的,指向我们a类型的成员数据或函数“b”到这里,就结束了!

2、a是对象,那么a必须有成员函数"operator->"(否则会报错)。那么就调用a的operator->函数。由于operator->返回的可能是指针,也可能是对象,那么就又进入了下一轮递归:是指针还是对象,走1或2,如此递归。

如何结束:不管a是指针或者对象,最终都是走到指针结束(当然,写错了也走不下去)。

下面是我写的一个例子,有助于理解!


#include <iostream>
#include <stdlib.h>

using namespace std;

class D
{
public :
    void Print(){cout<<"I am in class D!"<<endl;}
};

class C
{
public :
    void Print(){cout<<"I am in class C!"<<endl;}
    D* operator->(){return &m_d;}
private :
    D m_d;
};

class B
{
public :
    void Print(){cout<<"I am in B!"<<endl;}
    C &operator ->(){return m_c;}
private :
    C m_c;
};

class A
{
public :
    void Print(){cout<<"I am in A!"<<endl;}
    C *operator ->(){return &m_c;}
private :
    C m_c;
};    



int main(int argc, char *argv[])
{
    A a;
    a->Print();                  //"I am in class C!";
    a->operator->()->Print();    //"I am in class D!"
    B b;
    b->Print();                  //"I am in class D!"

    system("PAUSE");	
    return 0;
}

如上代码:

1、a->Print();    那么,首先,a是对象,而且有operator->,调用之,返回C*,是个指针。那么,接下来就是调用函数Print,找到对应的C的成员函数。

2、a->operator->()->Print(); 同上,a调用“->”返回的C*,是个指针;那么接下来就是调用C的成员函数。后面是个operator->(),正好是C的一个成员函数。C的operator->返回的是D*,是个指针,那么再调用对应的D的成员函数——Print(); 即“a->operator->()->Print()”中的operator->()需要看成一个C的成员函数(正好返回D*,可以调用箭头“->”)就好理解了。

3、b->Print();   b是对象,调用operator->返回C对象,那么需要再次递归——C是对象,调用operator->返回D*,那么就是指针,可以走向结束:调用对应的函数Print。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值