4 回答
它不必是朋友,但它不能是会员。成员运算符仅在它们位于对应于左侧操作数的类中时才起作用。
如果您将 ostream 运算符放在类本身中,那么它将无法按您期望的方式工作。这将是一个成员函数,意味着调用它必须这样做:c.operator<<("output")
这显然不是你的意思。要使其按您期望的 ostream 运算符工作,它必须在类之外。您可以通过使其成为朋友来做到这一点,或者只是将其放在类之外并使用 getter(访问器)来输出数据。
添加一个public
返回值的查询方法count_
,那么它不必是friend
:
Counter{
public:
int count() const { return count_; }
private:
int count_;
};
std::ostream& operator<<(std::ostream& outStream, const Counter& c){
outStream << c.count();
return outStream;
}
不幸的是,流输出运算符 ( << ) 的有用重载不能是类成员,因为 ostream& 必须在使用和声明的左侧。他们不需要成为您希望流式传输的班级的朋友,除非他们需要访问受保护或私人成员。这意味着如果您可以仅使用诸如观察者/访问者之类的公共函数来实现流式操作符,而无需将其声明为朋友。
在您的第一个 Counter 类中,您声明了一个似乎无效的类的成员函数。在 Counter 类的第二个示例中,您声明 << 的运算符重载似乎有效,可以访问私有成员。在第二个示例中,该函数仍必须在类之外声明。
C 和 C++中的Wikipedia运算符有一个很好的可能的运算符重载列表,包括类中的 << 重载,尽管它们不是很有用。类中的重载必须向后调用CounterInstance << cout;
,这是违反直觉的。