【问题标题】:Ostream << overloading confusionOstream << 重载混乱
【发布时间】:2011-08-24 18:53:14
【问题描述】:

当你为一个类重载

ostream& operator<<(ostream& s, const SomeClass& c) {
    //whatever
    return s;
}

当它已经可以通过引用直接修改时,返回 ostream 有什么好处?这对我来说似乎是多余的-尽管我确定不是:)

【问题讨论】:

    标签: c++ stream


    【解决方案1】:

    它允许将输出“链接”在一起。如:

    std::cout << someObj << someValue;
    

    这相当于:

    operator<<(operator<<(std::cout, someObj), someValue);
    

    【讨论】:

      【解决方案2】:

      这不是多余的,但对于链接调用很有用。使用 std::string::append 之类的函数更容易看到,所以我将从它开始:

      std::string mystring("first");
      mystring.append(" second");
      mystring.append(" third");
      

      可以改写为:

      std::string mystring("first").append(" second").append(" third");
      

      这是可能的,因为 .append() 返回对其修改的字符串的引用,因此我们可以继续将 .append(...) 添加到末尾。与您正在做的事情相关的代码正在改变:

      std::cout << "first";
      std::cout << " second";
      std::cout << " third";
      

      进入这个。由于 operator

      std::cout << "first" << " second" << " third";
      

      看到相似之处和有用性了吗?

      【讨论】:

      • 谢谢 - 每个人都有相似的答案,但我很欣赏这个例子 - 它使它的工作原理更加明显。 :)
      【解决方案3】:

      这样您就可以将operator&lt;&lt; 的链式调用编写为:

      stream << s1 << s2 << s3 ;
      

      如果不返回ostream&amp;,则不能多次写入。

      你可以这样想:

       operator<<(operator<<(operator<<(stream, s1), s2), s3);
      

      或者作为,

       ((stream << s1) << s2) << s3 ;
      

      首先(stream &lt;&lt; s1) 返回stream&amp;,您再次调用&lt;&lt;,它变成stream &lt;&lt; s2,它返回stream&amp;,您再次调用&lt;&lt;,它变成stream &lt;&lt; s3

      【讨论】:

        【解决方案4】:

        啊,这是如此链接的输出,就像

        cout

        仍然有效。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-25
          相关资源
          最近更新 更多