Рассмотрим функцию, которая должна выводить num и den Rational
:
ostream& operator<<(ostream& out, const Rational& r)
{
return out;
}
К сожалению, это всего лишь глобальная функция.Как и любая другая глобальная функция, она не может получить доступ к закрытым членам Rational
.Чтобы заставить его работать с Rational
объектами, необходимо сделать его friend
из Rational
:
class Rational
{
private: int m_t,m_b;
// ...
friend ostream& operator<<(ostream& out, const Rational& r);
};
ostream& operator<<(ostream& out, const Rational& r)
{
out << r.m_t << "/" <<r.m_b;
return out;
}
friend ostream& operator<<(ostream& out, const Rational& r);
внутри Rational
класса указывает, что функция ostream& operator<<(ostream& out, const Rational& r)
может напрямую использоватьЛичные члены Rational
.
Теперь, когда вы пишете:
Rational r(1, 2); // Say, it sets num and den
cout << r;
, выполняется следующий вызов функции:
operator<<(cout, r);
Можете ли вы написать operator<<
как функция-член Rational
?Это просто невозможно из-за вышеуказанного преобразования, где cout
должен быть первым параметром.Если вы сделаете operator<<
членом Rational
:
class Rational
{
private: int m_t,m_b;
// ...
public:
ostream& operator<<(ostream& out) const
{
out << r.m_t << "/" <<r.m_b;
return out;
}
};
, вам нужно назвать его так:
Rational r(1, 2);
r.operator<<(cout);
, что ужасно.