gpt4 book ai didi

c++ - 使用 ostream 和链接的运算符重载。为什么要通过引用返回?

转载 作者:太空狗 更新时间:2023-10-29 19:53:20 26 4
gpt4 key购买 nike

对此有很多问题和答案,但我真的找不到为什么我们需要通过引用返回。

如果我们有(假设运算符已经为对象 MyObject 正确重载):

    MyObject obj1;
MyObject obj2;
cout << obj1 << obj2;

现在,将有像 ((cout << obj1) << obj2)) 这样的子表达式;问题是为什么我们不能按值返回? (好吧,假设它允许返回 ostream 作为值)如果 cout << obj1 返回流对象而不是引用,有什么区别?为什么链接是不可能的呢?就像“=”运算符的重载一样,如果我们按值返回,我们不能像 A=B=C=D 那样链接。为什么?


感谢您的回答。我意识到我可以在不通过引用返回的情况下进行链接,但是当重载“=”时我的输出是完全不同的。如果我写:

    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){
Blah ret;
ret.x = rhs.x;
ret.y = rhs.y;
return ret;
}
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;
}

输出结果是:8,97,54,12,3

但是如果我通过引用返回重载并将参数设置为引用,并且在重载时修改并返回 *this,我得到:2,32,32,32,3

第一个例子中没有对象被改变的原因是什么?是因为 lvalues vs rvalues 吗?相比之下,速记运算符怎么样?


好的,另一个更新。如前所述,正确的结果应该是所有的 2,3。但是,如果我将重载运算符写为:

     Blah Blah::operator =(Blah rhs){
x = rhs.x;
y = rhs.y;
return *this;
}

然后,我会得到正确的结果。 (2,3 2,3 2,3 2,3)。 *this 会发生什么?重载运算符在重载函数中用 rhs 更新 lhs,但返回 *this 似乎没有意义。 *this 在哪里结束: b3 = b4 = b2 = b1 ?它会尝试返回到左侧,以便当链到达 b3 时它实际上不返回任何内容(它将尝试返回到左侧)吗?

最佳答案

主要是因为按值返回会产生一个拷贝,而iostream 对象不可复制。他们有状态和身份,目前尚不清楚复制它们意味着什么:对象包含(至少在逻辑上)它在流,所以如果我创建一个拷贝,我有两个对象在流中的相同位置写入。

关于c++ - 使用 ostream 和链接的运算符重载。为什么要通过引用返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14935502/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com