3
4

4 回答 4

2

它不必是朋友,但它不能是会员。成员运算符仅在它们位于对应于左侧操作数的类中时才起作用。

于 2012-05-31T21:57:19.953 回答
2

如果您将 ostream 运算符放在类本身中,那么它将无法按您期望的方式工作。这将是一个成员函数,意味着调用它必须这样做:c.operator<<("output")这显然不是你的意思。要使其按您期望的 ostream 运算符工作,它必须在类之外。您可以通过使其成为朋友来做到这一点,或者只是将其放在类之外并使用 getter(访问器)来输出数据。

于 2012-05-31T21:52:25.917 回答
2

添加一个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;
}
于 2012-05-31T21:52:26.360 回答
1

不幸的是,流输出运算符 ( << ) 的有用重载不能是类成员,因为 ostream& 必须在使用和声明的左侧。他们不需要成为您希望流式传输的班级的朋友,除非他们需要访问受保护或私人成员。这意味着如果您可以仅使用诸如观察者/访问者之类的公共函数来实现流式操作符,而无需将其声明为朋友。

在您的第一个 Counter 类中,您声明了一个似乎无效的类的成员函数。在 Counter 类的第二个示例中,您声明 << 的运算符重载似乎有效,可以访问私有成员。在第二个示例中,该函数仍必须在类之外声明。

C 和 C++中的Wikipedia运算符有一个很好的可能的运算符重载列表,包括类中的 << 重载,尽管它们不是很有用。类中的重载必须向后调用CounterInstance << cout;,这是违反直觉的。

于 2012-05-31T21:58:57.067 回答