14-7 成员访问运算符
目标代码
本节重在理解下述的代码,尤其是->的返回值
class StrBlobPtr{
public :
string& operator*() const{
auto p = check(curr, "dereference past end");
return (*p)[curr]; //*p是对象指向的vector
}
string* operator->() const{
//将实际工作委托给解引用符号
return & this->operator*();
}
}
因为不改变对象,所以重载为const函数
为什么->返回指针
point->mem的执行过程
对于代码point->mem
的执行过程,实际上有两种情况,他们的返回值不同
-
如果point是指针。
point->mem
返回指针指向的对象即(*point).mem
-
如果point是重载了operator->的类对象。
point->mem
的执行取决于point.operator()->
的结果。- 如果
point.operator()->
返回的是一个没有重载operator->()
的对象指针,那么会对返回的指针执行情况1,最终返回一个对象 - 如果
point,operator()->
返回一个类对象的指针且该对象也含有重载的operator->()
,那么对该类对象指针重复情况2
- 如果
该过程类似于一个递归,最终必然从情况1退出递归,得到一个指针指向的对象
那为什么需要这么设计,直接返回一个对象不好吗?:为了链式使用。
因为->左侧对象必须是指针,所以只有->运算结果返回指针,
诸如
point->mem->mem_of_mem
的表达式才会成立