箭头操作符,一般都有左右两部分: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。