假设它们没有被实现为friend
函数。
class Foo
{
// in here?
ostream& operator<<( ostream&, const Foo & );
};
或者
class Foo
{
};
// out here?
ostream& operator<<( ostream&, const Foo & );
为什么?
假设它们没有被实现为friend
函数。
class Foo
{
// in here?
ostream& operator<<( ostream&, const Foo & );
};
或者
class Foo
{
};
// out here?
ostream& operator<<( ostream&, const Foo & );
为什么?
将它们声明为非成员朋友函数或在 Foo 的周围名称中。您的第一个示例缺少关键要素:朋友。
原因是 C++ 查找要调用的函数(以及运算符)的方式:参数相关查找。
引用 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
这样做的方式。