1

我正在学习运算符重载。重载“<<”运算符时,使用“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

4 回答 4

14

ostream您正在查看的是一个重载的“流插入”运算符,它允许使用典型cout << myObject语法将一些自定义类写入对象。

在这种情况下,变量被调用out是因为这是他们ostream为传递给函数的对象赋予的名称,它可以是任何输出流,无论是cout还是 anfstream或 a stringstream。这只是一个变量名,他们本可以调用它blah并编写:

ostream &operator<<( ostream &blah, const IntList &L ) {
   blah << "[ ";
   // ...
}

通常,您选择一个描述性的变量名称,并且out作为输出流的名称是非常具有描述性的。

cout将是一个特别糟糕的变量名,因为它与 密切相关std::cout,用于专门写入标准输出流。此代码不专门写入标准输出,它通过运算符写入任何 ostream对象,<<因此他们为ostream参数选择了更通用的名称。

于 2012-10-18T15:58:21.753 回答
2

我想问一下 cout 和 out 之间的区别以及如果我使用 cout 而不是 out 会发生什么。感谢您的回答。

在这种情况下,ostream&( out) 是传递给函数的参数。这允许operator<<任何 ostream.

cout是一个特定 ostream的实例——标准输出流。如果他们cout在这里使用,您将无法<<cerr(标准错误流)或任何其他ostream. 如果您将正文out中的 (当然,如果您将参数更改为 named ,这不会发生 - 但它会误导任何查看此代码的人,因为人们会期望代码写入标准输出流,而不是流被传入。) coutcoutcout

一般来说,cout如果您特别提到std::cout标准输出流,您只会希望将其用作名称,因为在其他上下文中使用它会非常混乱。

于 2012-10-18T16:00:18.103 回答
1

out 是传递给重载运算符(在运算符的实现内部)的 ostream 对象的名称。

重载运算符允许您编写这样的代码

IntList i;
cout<<i;

或者

cerr<<i;

在实现中,如果您cout替换,则第二次调用

cerr<<i;

将打印到标准输出,而它应该打印到标准错误。

于 2012-10-18T16:02:23.843 回答
0

这里的关键实际上是函数签名中的类型:只要它是一个具有两个参数的独立函数 - 一个是类型std::ostream&,另一个能够与要流式传输的值匹配,那么函数体就会被调用。它应该返回对流的引用以允许链接(如 中if (cout << firstIntList << secondIntList))。

只要不是保留字,实际的参数名称就可以随心所欲。我倾向于使用“os”,就像在输出流中一样。

于 2012-10-18T16:07:17.653 回答