->
这个符号的重载比较特殊,它的重载函数不能随便写,应该保持它的基本含义:进行成员访问。具体来说,假如point是一个自定义的类(而不是指针),那么point->mem
将首先调用自定义的operator->()
函数,如果operator->()
返回的是一个指针,那么就对这个指针调用->
,即它的默认的先解引用再访问成员mem的功能,并将其作为point->mem
的最终返回结果;如果operator->()
返回的仍然不是指针而是另一个自定义了->
符号的类,那么继续上述的过程,直到最终能得到一个指针,对这个指针使用默认的->
函数。
于是在这里,先是调用operator->()
函数,返回的&(operator*())
即为指向node的data的指针,于是继续对这个指向data的指针调用->
函数,所以它实际上获得的是data的成员。