Loading

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 的执行过程,实际上有两种情况,他们的返回值不同

  1. 如果point是指针。point->mem返回指针指向的对象(*point).mem

  2. 如果point是重载了operator->的类对象。point->mem的执行取决于point.operator()->的结果。

    • 如果point.operator()->返回的是一个没有重载operator->()的对象指针,那么会对返回的指针执行情况1,最终返回一个对象
    • 如果point,operator()->返回一个类对象的指针且该对象也含有重载的operator->(),那么对该类对象指针重复情况2

该过程类似于一个递归,最终必然从情况1退出递归,得到一个指针指向的对象

那为什么需要这么设计,直接返回一个对象不好吗?:为了链式使用

因为->左侧对象必须是指针,所以只有->运算结果返回指针,

诸如point->mem->mem_of_mem的表达式才会成立

posted @ 2022-03-02 14:07  咪啪魔女  阅读(43)  评论(0编辑  收藏  举报