我开始制作自己的复制构造函数,这对我来说总体上是有道理的。但是,关于做自己的赋值操作符的主题,我需要有人为我填写空白。
我几乎不明白为什么你要在所有的例子中返回*,例如下面的例子:
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)
事实上,在设置对象之前,只会引用复制构造函数。在这种情况下,它甚至不符合复制构造函数的签名。
答案 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)
原因是你的作业结果可能是另一个表达式的右值。