Dlaczego tak
W wyrażeniu std::cout << u lewym argumentem jest strumień, a nie Ulamek, więc operator nie może być metodą klasy Ulamek — musi to być funkcja zewnętrzna z dwoma parametrami. Deklaracja friend daje jej dostęp do pól prywatnych, a zwracanie referencji do strumienia pozwala łączyć wywołania, np. std::cout << u << '\n'. Metoda klasy oraz funkcja z odwróconą kolejnością parametrów wymagałyby zapisu u << std::cout, a operatora << nie można zadeklarować jako statycznej metody klasy.