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

标签 c++ operator-keyword ostream

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

如果我们有(假设运算符已经为对象 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,9 7,5 4,1 2,3

但是如果我通过引用返回重载并将参数设置为引用,并且在重载时修改并返回 *this,我得到: 2,3 2,3 2,3 2,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/

相关文章:

c++ - line 是什么意思?

c++ - istream >> ostream << 使用 * 指针重载运算符

c++ - 当我引用 std::ostream 进行编译时,会弹出一个奇怪的错误

c++ - 调用操作 ostream 的函数不需要括号。 C++

c++ - 检测到堆损坏

c++ - 重载 operator[] 不断抛出运行时错误

c++ - 将 std::ostream 的子级传递给需要 std::ostream * 的库

c++ - 避免具有多个目标的重复 CMake 代码

c++ - 反向复制数组

c++ - libboost_log_setup.a 库的原因?