最近由于工作,学习了下箭头操作符,好复杂的说,过了没几天就忘了,又学了一遍。
同时决定,这里记录下,备忘!
(这里的内容,参考了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。