Note:您可能想看看运算符重载常见问题解答.
二元运算符可以是其左侧参数的类的成员,也可以是自由函数。 (某些运算符(如赋值)必须是成员。)由于流运算符的左侧参数是流,因此流运算符必须是流类的成员或自由函数。规范的实现方式operator<<
对于任何类型都是这样的:
std::ostream& operator<<(std::ostream& os, const T& obj)
{
// stream obj's data into os
return os;
}
请注意,它是not成员函数。另请注意,它需要对象按每个流式传输const
参考。这是因为您不想复制对象以对其进行流式传输,并且也不希望流式传输更改它。
有时,您想要流式传输其内部无法通过类的公共接口访问的对象,因此操作员无法访问它们。那么你有两个选择:要么将一个公共成员放入进行流式处理的类中
class T {
public:
void stream_to(std::ostream&) const {os << obj.data_;}
private:
int data_;
};
并从操作员处调用:
inline std::ostream& operator<<(std::ostream& os, const T& obj)
{
obj.stream_to(os);
return os;
}
或者让操作员成为friend
class T {
public:
friend std::ostream& operator<<(std::ostream&, const T&);
private:
int data_;
};
这样它就可以访问类的私有部分:
inline std::ostream& operator<<(std::ostream& os, const T& obj)
{
os << obj.data_;
return os;
}