c++ - 为什么在重载 = 运算符时通过引用返回?

标签 c++ constructor operator-overloading

我知道对此已经有很多问题,所以请耐心等待我回答这个问题。

所以我找到了this问题,我对修改这个有疑问。

class Blah {
public:
    Blah();
    Blah(int x, int y);
    int x;
    int y;
    Blah operator =(Blah rhs);
};
Blah::Blah() {}
Blah::Blah(int xp, int yp) {
    x = xp;
    y = yp;
}
Blah Blah::operator =(Blah rhs) {
    x = rhs.x;
    y = rhs.y;
    return *this;
}
int main() {

    Blah b1(2, 3);
    Blah b2(4, 1);
    Blah b3(8, 9);
    Blah b4(7, 5);
    b3 = b4 = b2 = b1;
    cout << b3.x << ", " << b3.y << endl;
    cout << b4.x << ", " << b4.y << endl;
    cout << b2.x << ", " << b2.y << endl;
    cout << b1.x << ", " << b1.y << endl;
    return 0;
}

所以我在这里没有使用 return by reference,同时重载了 = 运算符,我仍然得到了预期的输出。

为什么我应该通过引用返回?我看到的唯一区别是在按值返回时调用复制构造函数,但在按引用返回时不调用复制构造函数。

有人可以为我简化一下并解释通过引用返回背后的概念/想法吗?大约一年前在我的类里面讲过,但我仍然不明白。

最佳答案

这里没有严格的对错之分。你可以用运算符重载做一些奇怪的事情,有时这是合适的。但是,很少有充分的理由从 operator= 返回一个新实例。

返回值是启用链接。您的链接测试不完整。你的线路:

b3 = b4 = b2 = b1;

相同
b3 = (b4 = (b2 = b1));

您会看到这种情况下的预期输出。但是,像这样链接

(b3 = b4) = b1;

应该首先将b4分配给b3,然后将b1分配给b3。或者您可能想在返回的引用上调用一个方法:

(b3 = b4).foo();

当您返回一个拷贝时,第二个赋值将是一个临时对象,成员函数 foo 将在一个临时对象上调用,而不是像预期的那样在 b3 上调用。要查看此操作,请考虑此输出

int main() {

    Blah b1(2, 3);
    Blah b2(4, 1);
    Blah b3(8, 9);
    Blah b4(7, 5);        
    (b3 = b4) = b1;
    cout << b3.x << ", " << b3.y << endl;
    cout << b1.x << ", " << b1.y << endl;
    return 0;
}

退回拷贝时:

7, 5
2, 3

返回引用时:

2, 3
2, 3

更简单的原因是您不想在不需要制作拷贝时返回拷贝。

关于c++ - 为什么在重载 = 运算符时通过引用返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63041350/

相关文章:

c++ - 使用 PugiXML 进行 XML 解析,无限循环

java - Intellij IDEA : How to change all constructor calls after refactoring the constructor itself?

delphi - 重载三个扩展记录的添加运算符

c++ - 如何设置整数的最小/最大值,其中 `++` 和 `--` 以及一般数学服从您在 c++ 中设置的限制?

c++ - 使用显存的c中的文本编辑器

c++ - x = x+++++x; 的评估顺序是什么?是?

java类调用/调用jsp文件

c# - 在 C# 中不使用参数将信息传递给构造函数

c++ - 运算符<<在单例中的重新定义

C++ strtok 无法获得 2 个 token Borland