我正在学习运算符重载。当重载“<<”时,正在使用“out”而不是“cout”运营商。我不明白为什么。
ostream &operator<<( ostream &out, const IntList &L ) {
out << "[ ";
for (int k=0; k< L.numItems; k++) {
out << L.Items[k] << ' ';
}
out << ']';
}
我想问cout和out之间的区别,如果我使用cout而不是out,会发生什么。 谢谢你的回答。
答案 0 :(得分:14)
您所看到的是一个重载的“流插入”运算符,允许使用典型的ostream
语法将一些自定义类写入cout << myObject
对象。
这种情况下的变量称为out
,因为这是他们为传递给函数的ostream
对象赋予的名称,可能是任何输出流,无论是cout
还是fstream
还是stringstream
。它只是一个变量名,他们可以称之为blah
并写成:
ostream &operator<<( ostream &blah, const IntList &L ) {
blah << "[ ";
// ...
}
通常,您选择一个描述性的变量名称,out
作为输出流的名称非常具有描述性。
cout
将是一个特别错误的变量名称,因为它与std::cout
密切相关,用于专门写入标准输出流。此代码没有特定于标准输出写入,它通过ostream
运算符写入任何 <<
对象,因此他们为{{1}选择了更通用的名称参数。
答案 1 :(得分:2)
我想问cout和out之间的区别,如果我使用cout而不是out,会发生什么。谢谢你的回答。
在这种情况下,ostream&
(out
)是传递给函数的参数。这允许operator<<
处理任何 ostream
。
cout
是特定的 ostream
实例 - 标准输出流。如果他们在此处使用cout
,您将无法在<<
(标准错误流)或任何其他cerr
上使用ostream
运算符。如果您将out
替换为正文中的cout
,则无论何时在不同的ostream上使用此内容,都会将其写入cout
。 (当然,如果您将参数更改为名为cout
,则不会发生这种情况 - 但对于任何查看此代码的人来说都会产生误导,因为人们会期望代码写入标准输出流,而不是写入传入的流。)
一般情况下,如果您特别提到cout
- 标准输出流,您只想使用std::cout
作为名称,因为在其他环境中使用它会非常混乱。
答案 2 :(得分:1)
out是传递给重载运算符的ostream对象的名称(在运算符的实现中)。
重载运算符允许您编写这样的代码
IntList i;
cout<<i;
或
cerr<<i;
在实施中,如果用 cout 替换 out ,那么第二次调用
cerr<<i;
将打印到标准输出,而它应该打印到标准错误。
答案 3 :(得分:0)
这里的关键是函数签名中的类型:只要它是具有两个参数的独立函数 - 一个类型std::ostream&
而另一个能够与要流式传输的值匹配,那么将调用函数体。它应该返回对流的引用以允许链接(如if (cout << firstIntList << secondIntList)
)。
实际的参数名称是你想要的,只要它们不是保留字。我倾向于使用“os”,就像输出流一样。