【问题标题】:Why is const word not used with ostream object in overloading << operator? [duplicate]为什么在重载 << 运算符时 const 字不与 ostream 对象一起使用? [复制]
【发布时间】:2025-12-09 19:15:02
【问题描述】:

要重载的算子函数原型

friend ostream& operator<<(ostream&, const className&);

我是新手,如果能用简单的例子解释一下,将不胜感激。谢谢

【问题讨论】:

  • 你想在哪里使用const
  • @Yksisarvinen 之前有人问过,OP 想写 friend const ostream&amp; operator&lt;&lt;(const ostream&amp;, const className&amp;); 以便可以将临时的 ostream 对象传递给 operator&lt;&lt; 我确实试图解释原因,但显然不是很好。
  • @joh 请随意将其标记为重复
  • @_Static_assert 不,它不是重复的。这个问题是作为另一个问题的旁白提出来的。

标签: c++ oop operator-overloading ostream


【解决方案1】:

写入ostream 类型的对象的行为可以改变其状态。例如,可以设置失败位或任何其他失败状态。因此,函数参数是对非常量的引用。

【讨论】:

  • 更不用说概念上写入流不是 const,因为它会改变环境,例如 fstream 的文件位置。
【解决方案2】:

通常,当您编写时

foo f;
std::cout << f;

您忽略返回的值。请记住,调用运算符类似于调用方法,同一行可以写成:

operator<<(std::cout,f);

对于参数类型,请考虑将某些内容写入流确实会修改流的内部状态。因此,operator&lt;&lt; 采用非常量引用。您不能传递 const 对象/引用,因为常量流不允许插入任何内容。

现在链接:

foo f,g;
std::cout << f << g;

operator<<( operator<<( std::cout,f) , g);
            ------------------------
                     |
                     v
             returns non-const ref

如果operator&lt;&lt; 会返回一个常量引用,则您不能链接它。

【讨论】:

    最近更新 更多