流插入/提取操作符重载函数的原型在哪里?

时间:2013-04-28 01:28:21

标签: c++ operator-overloading

假设它们没有被实现为friend函数。

class Foo
{
// in here?
ostream& operator<<( ostream&, const Foo & );
};

class Foo
{
};
// out here?
ostream& operator<<( ostream&, const Foo & );

为什么?

2 个答案:

答案 0 :(得分:1)

将它们声明为非成员朋友函数或Foo的周围名称。你的第一个例子是缺少关键成分:朋友。

原因是C ++寻找函数(以及运算符)的方式来调用:依赖于参数的查找。

答案 1 :(得分:0)

引自Stanley Lippman的++入门书:

  

当我们定义符合iostream库约定的输入或输出运算符时,我们必须将其作为非成员函数。

一种选择是将类的重载<<>>声明为friend函数。 将其声明为friend函数的好处是它可以访问类的私有部分。

class Foo
{
  // in here?
  friend ostream& operator<<( ostream&, const Foo & );
  //^^should not miss this
 };

另一个选项是重载为free函数,为operator<<类实现Foo的规范方法是:

std::ostream& operator<<(std::ostream& os, const Foo & )
{
}

这种方式无法直接访问类的私有部分,需要提供一些成员函数来返回类的内部进行打印。

这取决于您的应用程序,第二种方式通常是canonical方式。