0

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

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

或者

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

为什么?

4

2 回答 2

1

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

原因是 C++ 查找要调用的函数(以及运算符)的方式:参数相关查找。

于 2013-04-28T01:34:10.080 回答
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这样做的方式。

于 2013-04-28T01:36:01.077 回答