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



假设它们不是作为friend函数实现的

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

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

,为什么?

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

原因在于c++查找函数(也包括操作符)调用参数依赖查找的方式。

引自Stanley Lippman的c++入门书:

定义符合iostream标准库约定的输入或输出操作符时,必须将其作为非成员函数。

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

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

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

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

这样你就不能直接访问类的私有部分,你需要提供一些成员函数来返回你的类的内部用于打印。

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

最新更新