使用赋值运算符返回* this

时间:2010-07-14 16:45:44

标签: c++

我开始制作自己的复制构造函数,这对我来说总体上是有道理的。但是,关于做自己的赋值操作符的主题,我需要有人为我填写空白。

我几乎不明白为什么你要在所有的例子中返回*,例如下面的例子:

Foo & Foo::operator=(const Foo & f)
{

//some logic

return *this;

}

所以如果我有一些陈述:

Foo f;
f.hour = 7;

Foo g;
g = f;

一旦赋值运算符运行,它就会返回对g对象的引用(* this)。所以现在的问题是,我现在不会有这样的隐含声明吗?:

g = g (g being a reference)

事实上,在设置对象之前,只会引用复制构造函数。在这种情况下,它甚至不符合复制构造函数的签名。

4 个答案:

答案 0 :(得分:7)

您想要返回*this,以便链接=

Foo f, g, h;

f = g = h;

这基本上是将h分配到g,然后将g(由return *this返回)分配到f

f = (g = h);

有时使用的另一种情况是在条件中进行赋值(被许多人认为是坏的风格):

if ( (f = 3).isOK() ) {

使用语句g = f;,只会忽略返回,就像您3 + 4;一样。

答案 1 :(得分:4)

我认为你有点混淆中缀符号的想法。 g = f并不意味着call operator= of g with f and put the result into g意味着apply operator= on g with parameter f and set the value of this expression to the result。这与其他中缀运算符相同,例如+/

某些语言的运算符可以像普通函数一样应用(在C ++中使用一些无关的语法),例如= (g f),它可以更清楚地显示概念。

编辑:

例如,通常用作IO的示例:

// loop until some sentinel value
while ((nextChar = (char) getchar()) != 'Q') {
  string += nextChar;
}

请注意,因为=运算符返回其第一个参数(在此示例中为nextChar),您可以编写赋值和测试。

答案 2 :(得分:0)

  

一旦赋值运算符运行,它就会运行   返回对g对象的引用   (*这个)。所以现在的问题是,   我现在不会发表声明   隐含地喜欢这个?:

     

g = g(g是参考)

不,但是您需要检查自我分配。返回*this的作用是使表达式(g=f)g的值。这对于链接分配很有用。在像

这样的声明中
Foo a, b, c;
a = b = c;

a正在为方法operator=分配返回值。返回*这使得此语句执行预期的操作(将c的值分配给b,然后将b的新值分配给a)。

答案 3 :(得分:0)

原因是你的作业结果可能是另一个表达式的右值。