Q1。
所有插入器功能都具有以下一般形式:
ostream &operator<<(ostream &stream,class_type obj){
//body of inserter
return stream;
}
该函数的第一个参数是对输出流的引用。所以,我的问题是我可以将该参数作为ostream的对象,即
这个定义有效吗?
ostream &operator<<(ostream stream,class_type obj) //Can i create a parameter of stream object here
如何将参数设为流对象而不是对流的引用?
Q2。 您能解释为什么需要插入器和提取器将ref返回到流中。 (一个例子非常有用!)
谢谢!
答案 0 :(得分:4)
1:不,您无法将其作为对象(即通过值传递),因为操作员需要对原始流进行操作。如果您传入该对象,它将创建一个副本,对其进行操作,然后在该函数结束时将其丢弃。
2:他们需要返回对流的引用(不仅仅是任何流,而是作为参数传递的相同流),以便启用它:
cout << "Multiple " << "outputs";
如果您没有返回引用,则链中的下一个<<
运算符也将无法在您返回它的同一个流上操作。
答案 1 :(得分:2)
你可以做任何你喜欢的事情:通过值获取流,获取除流之外的其他内容,通过复制返回,不返回任何内容,或返回任何类型的对象。但是......你不会得到你期望使用流的行为。
正确看待这个问题的方法是:首先要知道你试图启用什么语法及其行为应该是什么,然后理解为什么必须以某种方式完成事情才能使该语法以这种方式工作。
因此。你想要启用的是这个。假设您有一个自定义类X
,并且您决定使其与输出流一起使用。这意味着您希望以下工作:
cout << x;
cout << x << x;
cout << x << " test ";
cout << " test " << x << " test ";
// etc
对于所有按预期工作的人,您需要operator<<
通过引用获取std::ostream
并返回对同一ostream对象的引用。