C++重载->,它是如何工作的?

C++ overloading ->, how does it work?

本文关键字:何工作 工作 重载 gt C++      更新时间:2023-10-16

为什么如果我重载此代码中的 -> 运算符

class subobj
{
public:
  void get()
  {
    printf("ea");
  }
};
template<typename T> class testPT
{
public:
  T* operator->()
  {
    return ptr;
  }

  T* ptr;
};

int main()
{
  subobj myobj;
  testPT<subobj> myclass;
  myclass.ptr = &myobj;

  myclass->get();

    return 0;
}

我打印了"ea"字符串?

通过使用"myclass->",它应该只返回一个T*,一个指向对象的指针。我应该做类似的事情

myclass->->get()

实际调用 get() 例程。我哪里错了?

operator->是魔法。 :)

使用链接,这意味着只要您不返回普通指针,就会再次调用它。当您返回普通指针时,它会对 operator-> 进行最后一次调用。当您致电operator->

obj->foo;

它翻译为:

(obj.operator->())->foo;

除非obj是普通指针。

您甚至可以这样做:

template<typename T> class testPT2
{
public:
  T* operator->()
  {
    return ptr;
  }
  T* ptr;
};
template<typename T> class testPT
{
public:
  testPT2<T> operator->()
  {
    testPT2<T> p2;
    p2.ptr = ptr;
    return p2;
  }
  T* ptr;
};

通过有效应用三次operator->,它仍然有效。