为什么这段代码不起作用?为什么我需要返回类型作为参考?

时间:2011-01-26 23:29:03

标签: c++

ostream operator<<(ostream& os, class n);   

我需要知道内部发生了什么,以及如果返回类型不是引用,它为什么不起作用。我需要一些关于istreams和ostreams的好文章的链接,以帮助我理解它们(请不要太复杂的文章:D:D)非常感谢你。

更新1:请记住分享文章的链接,以便我可以了解有关ostream和istream对象的更多信息。谢谢。

5 个答案:

答案 0 :(得分:3)

ostream不是可复制的类型。

答案 1 :(得分:2)

std::ostream的复制构造函数是私有的 - 这意味着您无法创建流对象的副本。

每个流都有一个关联的底层缓冲区 - 它处理读/写(例如filebuf管理对文件的读/写)。如果您要制作流的副本,您打算如何处理此底层缓冲区?你无法复制它,因为那样你就会有两个缓冲区(保持不同的位置信息 - 例如写入的位置) - 想象一下这个问题......如果你“移动”它 - 即转移所有权,你有可能可以想象,松散缓冲区(如果复制到某个范围的流 - 比如说你将它传递给一个函数并且不返回它),那么会发生什么?对于像这样的复杂问题,使这个对象不可复制是有意义的......

答案 2 :(得分:1)

因为ostreamnoncopyable类。这是设计的,就像线程和其他不可复制的概念一样。

答案 3 :(得分:1)

通常在覆盖运算符&lt;&lt;它看起来像是近似的东西:

ostream& operator<<(ostream& os, class n)
{
    os << n.some_data() << n.some_other_data(); 

    return os;
}

如果您不将ostream作为参考返回,则无法执行此操作:

n myclass;
std::cout << myclass << std::endl;

答案 4 :(得分:0)

返回类型必须是对同一个流操作系统的引用,以便您可以将调用链接在一起。例如:

out << "hello" << " " << "world";

如果它不是引用,则返回类型将是一个值。每个值都是不同的流,因此“hello”和“world”会转到不同的地方。 引用所有引用到同一个相同的流,因此“hello”和“world”会输出到同一个地方。