Witam chciałbym się od was dowiedzieć dlaczego przeciążenie operatora wyjścia musi być zadeklarowana jako przyjaciel klasy, a nie jako metoda tej właśnie klasy ?
Przecież w drugim wypadku funkcja też będzie miała dostęp do prywatnych pól klasy.
0
1
dlaczego przeciążenie operatora wyjścia musi być zadeklarowana jako przyjaciel klasy
Nie musi. Wystarczy, że ma dostęp do potrzebnych bebechów klasy. Ale najczęściej taki dostęp jest możliwy jedynie przez przyjaźń.
a nie jako metoda tej właśnie klasy?
Żeby zapis był naturalny. Jeżeli zadeklarujesz operator jako metodę klasy, to potem będziesz go tak używał
obiekt << strumien
bo to jest to samo co
obiekt.operator<<(strumien)
A chcesz odwrotny zapis (bo jest zgodny z konwencją biblioteki standardowej)
strumien << obiekt
który jest równoważny
strumien.operator<<(obiekt)
lub
operator<<(strumien, obiekt)
Jeśli chcesz by strumień był po lewej stronie operatora, to albo
- przeciążasz
operator<<
dla strumienia, który przyjmuje obiekt Twojej klasy - przeciążasz globalny
operator<<(strumien&, const klasa&)
Opcja (1) najczęściej jest niemożliwa, bo strumień nie jest Twoją klasą, stąd wybór opcji nr 2.
0
Dzieki :)