перегрузка операторов в c ++ (с другом и без друга) - PullRequest
0 голосов
/ 30 сентября 2010

Эй, я хотел бы знать разницу между этими двумя определениями операторов:

1

class Rational{
//...
public:
//...
Rational operator -() const{ return Rational(-t,b);}
//...
};

2

class Rational{
//...
public:
//...
friend Rational operator -(const Rational& v) {return Rational(-t,b);}
//...
};

Насколько я понимаю, для использования:

Rational s = -r 

r.operator-()   // should happen

хотел бы пояснить разницу, спасибо!

1 Ответ

3 голосов
/ 30 сентября 2010

По большей части они одинаковы.

Прежде всего, я не думаю, что вы написали правильно. Они должны быть:

 // 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;

будет работать со вторым определением, но не с первым.

...