为什么在重载“<<”时使用“out”而不是“cout”运营商?

时间:2012-10-18 15:56:31

标签: c++ operator-overloading

我正在学习运算符重载。当重载“<<”时,正在使用“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,会发生什么。 谢谢你的回答。

4 个答案:

答案 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”,就像输出流一样。