По большей части они одинаковы.
Прежде всего, я не думаю, что вы написали правильно. Они должны быть:
// Member function. "-r" calls r.operator-()
Rational Rational::operator -() const{ return Rational(-t,b);}
// (technically a) global function. "-r" calls ::operator-(r)
friend Rational operator -(const Rational& v) {return Rational(-v.t,v.b);}
Основное отличие состоит в том, что если у вас есть другой тип (скажем, MyRational
), который можно преобразовать в объект Rational, то:
MyRational mr = MyRational();
Rational r = -mr;
будет работать со вторым определением, но не с первым.