【问题标题】:Why is "out" used instead of "cout" when overloading the "<<" operator?为什么在重载“<<”运算符时使用“out”而不是“cout”?
【发布时间】:2012-10-18 15:56:31
【问题描述】:

我正在学习运算符重载。重载“

  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 会发生什么。 感谢您的回答。

【问题讨论】:

  • 因为 cout 已经是另一个对象的名字了?
  • 您的回报在哪里?在这里发帖时错过了吗??
  • 我建议您将out 替换为wibble 看看会发生什么。你看名字没关系
  • @user1559792 您收到了很多很棒的答案。你有什么不接受的理由吗?

标签: c++ operator-overloading


【解决方案1】:

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

本例中的变量称为out,因为这是他们为传递给函数的ostream 对象赋予的名称,它可能是任何输出流,无论是@ 987654325@ 或fstreamstringstream。这只是一个变量名,他们可以称之为blah 并写道:

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

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

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

【讨论】:

  • 这也有一个约定的元素,因为它是一个输出流,但不一定是 cout。
【解决方案2】:

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

在这种情况下,ostream&amp; (out) 是传递给函数的参数。这允许operator&lt;&lt;任何 ostream 上工作。

cout 是一个特定 ostream 实例 - 标准输出流。如果他们在这里使用cout,您将无法在cerr(标准错误流)或任何其他ostream 上使用&lt;&lt; 运算符。如果您在正文中将out 替换为cout,则任何时候您在不同的ostream 上使用它,它都会被写入cout。 (当然,如果您将参数更改为 cout,则不会发生这种情况 - 但对于查看此代码的任何人来说,这会产生很大的误导性,因为人们会期望代码写入到标准输出流,而不是传入的流。)

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

【讨论】:

  • "如果他们在这里使用 cout,您将无法在 cerr 上使用 cout - 用作参数名称 - 不会与::std::cout 冲突,但肯定会产生误导。
  • @TonyD 是的 - 我试图添加一些东西来达到那种效果(当你发布它时正在写),因为我意识到它并不清楚。
  • @TonyD 我试图建议您是否将参数名称保持不变,但在方法主体中使用 cout。
  • 很公平——调试起来会很糟糕!干杯
  • 在函数体中使用cout这一业务是using namespace std;是等待发生的意外的另一个原因。一旦您选择的任何变量名称都可以作为您引入范围的标准名称进行拼写,您的拼写错误就有可能被编译。变量使用out,STDOUT 使用std::cout,我说:-)
【解决方案3】:

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

重载的操作符让你可以写出这样的代码

IntList i;
cout<<i;

cerr<<i;

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

cerr<<i;

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • "os" 名称太长。我倾向于使用 ostream & o。
    • @user93353: 是的,好点 - 我将更新我所有的代码;-P
    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 2023-03-25
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多