C++中的赋值运算符重载语法解释

4

我是C++的新手,需要一些帮助理解这段代码片段。

Queue & operator=(const Queue &rhs)
{
    front = rhs.front;
    nWaiting = rhs.nWaiting;
    for (int i = front, j = 0; j < nWaiting; j++) 
    {
        elements[i] = rhs.elements[i];
        i = (i + 1) % 100;
    }
    return *this;
}

我不理解代码中为什么要在运算符前加上"&",以及它是如何与*this一起工作的。

我理解运算符重载。例如下面的代码实现了加法运算符重载。然而,我不明白为什么赋值运算符(=)重载需要"&"。

V3 operator* (const double factor, const V3 &b)
{
    return (b * factor);
}

1
& 表示函数的返回类型是一个队列的引用。 - Thomas Jager
Queue& 返回的是同一个对象的引用,而不是副本。这样做的目的是让 = 操作改变原始对象并返回对自身的引用。 - jspcal
请注意,代码中的 & 标记不被称为操作符。操作符 & 获取一个对象的地址。但是在声明和其他指定类型的地方使用 & 时,这是完全不同的含义。在类型名称后面写上 & 另外定义了一种类型,它是刚刚命名的类型的引用。 - aschepler
3个回答

3
参考意味着避免复制对象。因此,它将返回对同一对象的引用。此外,它将作为lvalue提供。如果您考虑一下,当使用赋值运算符时,这就是您想要发生的。
在C ++中,每个对象都可以通过this指针访问自己的地址。
这意味着您返回对象本身。
如果您的问题是为什么我们使用*this而不是this,则发生这种情况是因为您需要先解引用指针,因为返回类型是引用(而不是指针,例如)。

在这种情况下,引用的目的不是为了避免复制,而是提供lvalue作为结果。 - Slava
@Slava 它实现了两个目的。 - M.M
@Slava 我也应该加上,谢谢!现在答案有改进了吗?我同意M.M. - gsamaras
@M.M我不太确定,假设对象非常小,通过值传递比引用更有效,那么operator=应该返回非引用吗? - Slava

3
& 意味着运算符返回一个引用(原始对象),而不是一个值(对象的副本)。这避免了不必要的复制。 this 是指调用运算符的对象本身的指针,因此 return *this 意味着返回左侧对象的引用 =
这使得运算符可以链接,例如 a = b = 1。这首先将 1 分配给 b,然后返回对 b 的引用。然后将 b 的值分配给 a。因此,ab 都为 1。

0

操作符可以没有任何返回值,但通常会启用链接,如下所示

c = (a = b);

这将把b赋值给a,然后将operator=调用的返回值赋值给c。由于您不想进行不必要的复制,因此返回对对象本身的引用,即*this。实际上,避免复制并不是使用引用的唯一原因,但如果您考虑

(d = e) = f;

如果operator=返回一个非const(!)引用,那么只有在将e分配给d,然后将f分配给d的情况下,才能按预期工作。

请注意,operator*是不同的,因为它不应修改调用它的对象,而是返回一个新实例(因此operator*的返回中没有&)。


@Slava const引用如何比非const引用更有效地防止复制? - 463035818_is_not_a_number
禁止复制更多?你从哪里得到这个想法的? - Slava
当您通过值传递函数参数时,您会创建一个副本,如果要避免复制,则将其作为const引用传递。在这种情况下,引用不是用于避免复制,而是提供lvalue。 - Slava
@Slava 现在开心了吗? - 463035818_is_not_a_number
@Slava operator=应该返回一个引用而不是一个值,但这并不是它应该工作的方式。 - 463035818_is_not_a_number
显示剩余14条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接