the most operatos can be overloaded as non-member operators.
This approach is most likely to be prefered because it gives you more options but some of them can only be implemented as member-operators.
do they always need to return type and if so what type
No but for there are "standard ways".
as for operator+ you should allways return either void or a copy of the class.
as for operator+= you should return a copy of *this.
the rational operators should return a bool (that's what they are here for after all)