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 @   咪啪魔女  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示