【问题标题】:Clarification on smart pointer's operator* and operator-> overloading澄清智能指针的 operator* 和 operator-> 重载
【发布时间】:2014-04-03 10:28:07
【问题描述】:

自从我使用 c++ 以来,它已经过去了很多,所以这里(可能是愚蠢的)问题:

一个基本的智能指针对象应该表现得像一个普通的指针,所以在一个典型的实现中,我们将*->运算符添加到对象中,如下所示:

template <class T> class auto_ptr
{
    T* ptr;
    public:
    explicit auto_ptr(T* p = 0) : ptr(p) {}
    ~auto_ptr()                 {delete ptr;}
    T& operator*()              {return *ptr;}
    T* operator->()             {return ptr;}
   // ...
};

现在,据我所知,c++ * 运算符(取消引用)代表:“通过 ptr 的值获取堆中指向的值”(对吗?),*ptr 的类型应该是T。那么我们为什么要返回地址呢?

T& operator*()              {return *ptr;}

代替:

T operator*()              {return *ptr;}

其次,通过具有以下 sn-p:

void foo()
{
    auto_ptr<MyClass> p(new MyClass);
    p->DoSomething();
}

现在,我如何通过编写p-&gt;DoSomething() 来访问ptr-&gt;DoSomething() 方法?逻辑上我会写错代码:

p->->DoSomething();

因为p-&gt; 返回一个T*,然后我需要另一个-&gt; 运算符来访问DoSomething() 方法。

感谢您的任何回答/澄清,并对最终英语不好表示抱歉。

【问题讨论】:

  • 指针不必指向堆。
  • 您不是在“返回地址”。这不是 C++ 的工作方式。请拿本书。
  • 如果 T::operator-&gt;() 存在且运算符被重载选择为最佳匹配函数,则表达式 x-&gt;m 被解释为 x 类型为 x 的类对象 (x.operator-&gt;())-&gt;m解决机制

标签: c++ pointers operator-overloading smart-pointers


【解决方案1】:

在 C++ 中,当你对一个函数求值时,你会得到一个值(除非函数的返回类型是 void)。值的类型始终是对象类型。因此,当您说f() 时,该表达式是T 类型的值。但是,有不同的类别值:

T    f();    =>   f() is a prvalue, passed along by copy
T &  f();    =>   f() is an lvalue, the same object that is bound to "return"
T && f();    =>   f() is an xvalue, the same object that is bound to "return"

因此,如果您希望函数生成不想复制的现有值,则必须将函数的返回类型声明为引用类型之一。如果返回类型不是引用类型,则会制作返回值的副本,而调用者只会看到该副本。

【讨论】:

  • 我最近看到很多人对这样的问题感到困惑。 c++ programming language中的解释可能会有所帮助
  • 谢谢Kerrek 和你们所有人,几天前,我和我的朋友们在阅读我的问题时笑了很多。
【解决方案2】:

解引用操作符返回一个 reference 因为你可以这样做例如

*somePointer = someValue;

somePointer 指向的值将更改为someValue。如果您按值返回,则上述表达式将具有分配给的临时值,然后该临时值被破坏并且更改丢失。

【讨论】:

  • 您不能真正“返回参考”。函数评估始终是一个值,而值永远不是引用......只是迂腐。
【解决方案3】:

您不必编写p-&gt;-&gt;DoSomething 的原因是operator-&gt; 递归直到找到不是指针的东西T*

p-&gt; 找到T*,它是一个指针,因此它下到另一个级别并找到一个MyClass 对象,因此它停止并对其执行正常的operator.

请注意,在这种情况下,智能指针不被视为指针。

【讨论】:

  • operator-&gt; 递归直到找到不是指针的东西:你能指出任何参考资料或标准部分来理解这一点吗?
  • 元对OP的评论总结得比我好。
  • +1 找到了~ N3337 草稿§13.3.1.2/8:如果operator->函数返回的值是类类型,这可能会导致选择调用另一个运算符-> 函数。该过程一直重复,直到 operator-> 函数返回一个非类类型的值。
  • 谢谢,目前我自己还没有找到。
猜你喜欢
  • 2018-12-26
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 2014-06-13
相关资源
最近更新 更多