You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中重载成员访问运算符->的工作原理是什么?

C++ 中 operator-> 的特殊处理逻辑

你对普通指针->的理解是正确的:identifier->member确实等价于(*identifier).member。但自定义类重载的operator->有特殊的链式调用规则,这就是为什么你的代码只需写一次->就能正常工作。

编译器的具体处理流程

当对类对象使用->访问成员时,编译器会执行以下步骤:

  • 首先调用该对象的operator->()方法,获取返回值
  • 检查返回值类型:
    • 如果返回的是指针类型,编译器会自动对这个指针再执行一次->操作,直接完成成员访问
    • 如果返回的是重载了operator->()的类对象,则递归调用该对象的operator->(),直到得到可直接访问成员的指针或对象

在你的代码中:
a->x 首先触发A_Abstraction::operator->(),返回A*类型的指针;接着编译器自动对这个指针执行->x操作,等价于手动写(*(a.operator->())).x,最终访问到A类的x成员。因此不需要写成a->->x,编译器帮你完成了第二次->的隐式调用。

你的可运行代码

#include <iostream>

class A
{
public:
    int x{0};
};

class A_Abstraction
{
public:
    A *ptrToA;
    A_Abstraction() : ptrToA{new A} {};
    A *operator->() { return ptrToA; }
};

int main()
{
    A_Abstraction a;
    a->x = 10;
    std::cout << a->x << '\n';
}

补充说明

这种设计主要是为了支持智能指针(如std::unique_ptr、std::shared_ptr)这类封装场景,让智能指针的使用语法和普通指针保持一致,提升代码的可读性和易用性。

内容的提问来源于stack exchange,提问作者wigi426

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:11:16