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
的表达式才会成立
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用