【问题标题】:C++ Overloading -> operator, how does it work?C++ 重载 -> 运算符,它是如何工作的?
【发布时间】:2012-10-04 09:19:02
【问题描述】:

我试图实现一个类似于标准库 auto_ptr 的智能指针类,因此我不得不重载 -> 运算符。这是我的代码

template <typename T>
class SmartPtr
{

   T * operator -> ()
  {
    return _pAct;
  }

 private:
 T * _pAct;
};

没有显示其余的实现,以避免转移我的查询。

现在我创建一个 A 类的 SmartPtr 并在其上调用 A 中的 Show() 方法:

SmartPtr smPtr(new A);
smPtr->Show();

这是我的查询(不知道它是否也有效)

由于 SmartPtr::operator->() 返回 A*,因此对 show 的调用应转换为 (A*)Show。为什么它转换为 (A*)->Show() ?

或者换句话说,smPtr->Show() 是如何在任何 smPtr->() 运算符返回的情况下调用 Show() 的?

【问题讨论】:

    标签: c++ operator-overloading


    【解决方案1】:

    因为运算符-&gt; 按顺序应用,直到不能再应用为止。

    13.5.6 类成员访问 [over.ref]

    1) operator-&gt; 应该是一个非静态成员函数,不接受 参数。它使用-> postfix-expression -> id-expression实现类成员访问表达式x-&gt;m被解释 作为(x.operator-&gt;())-&gt;m 用于x 类型的类对象T if T::operator-&gt;() 存在并且如果运营商被选为最佳 通过重载解析机制(13.3)匹配函数。(强调我的)

    这意味着,在你的情况下,它转化为:

    smPtr.operator->()->Show();
              |           |
          returns A*   call Show on the A*
    

    【讨论】:

      猜你喜欢
      • 2020-09-20
      • 2015-05-25
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多