什么是赋值运算符的返回类型?

时间:2013-03-08 11:25:37

标签: c++ reference assignment-operator dereference lvalue

我刚刚开始使用C ++。我对赋值和解引用运算符的返回类型有点困惑。我正在阅读C ++ Primer一书。在不同的场合,作者说,赋值运算符的返回类型是对左手操作数的类型的引用,但后来,他说返回类型是左手操作数的类型。我已经提到了C ++ 11标准版。 5.17,其中返回类型被描述为"左值是指左手操作数"。

同样,我无法确定dereference是返回指向对象还是返回对象的引用。

这些陈述是否相同?如果是这样,那怎么样?任何解释都将不胜感激。

3 个答案:

答案 0 :(得分:23)

标准正确定义了赋值运算符的返回类型。 实际上,赋值操作本身并不依赖于返回值 - 这就是为什么返回类型不易理解。

返回类型对于链接操作很重要。 请考虑以下结构:a = b = c;。这应该等于a = (b = c),即c应分配到bb分配到a。将其重写为a.operator=(b.operator=(c))。为了使a的赋值正常工作,b.operator=(c)的返回类型必须引用内部赋值结果(它也可以用于复制,但这只是一个不必要的开销)。

取消引用操作符返回类型取决于您的内部逻辑,以适合您需要的方式定义它。

答案 1 :(得分:9)

它们都可以是任何东西,但通常 operator =通过引用返回当前对象,即

A& A::operator = ( ... )
{
   return *this;
}

是的,“参考左手操作数的类型”和“左手操作数的左值”意思相同。

取消引用运算符基本上可以有任何返回类型。它主要取决于程序的逻辑,因为您正在重载应用于对象的运算符,而不是指向对象的指针。通常,这用于智能指针或迭代器,并返回它们包裹的对象:

struct smart_ptr
{
   T* innerPtr;
   T* smart_ptr::operator* ()
   {
      return innerPtr;
   }
}

smart_ptr p; 
T* x = *p;  

答案 2 :(得分:1)

我见过类似的问题,但我想最好使用

X& X::operator=(const X&);

使用它,您将能够在链分配中重用该对象。