2010-09-30 4 views
0

Hey, je voudrais connaître la différence entre ces deux définitions de l'opérateur:surcharge d'opérateur en C++ (avec et sans ami)

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);} 
//... 
}; 

pour autant que je comprenne, pour l'utilisation de:

Rational s = -r 

r.operator-() // should happen 

voudrais une explication pour la différence, merci!

+0

Ces déclarations sont-elles dans la classe? –

+0

Votre # 2 n'a même pas besoin d'être un ami - il n'accède à aucun membre privé de Rational. Il peut (et devrait) être déclaré/défini entièrement en dehors de la classe. –

Répondre

3

Pour la plupart, ils sont identiques. Premièrement, je ne pense pas que vous ayez écrit correctement. Ils devraient être:

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

La principale différence est que si vous avez un autre type (par exemple MyRational) qui est convertible à un objet rationnel, alors:

MyRational mr = MyRational(); 
    Rational r = -mr; 

travaillera avec la deuxième définition, mais pas pour le premier.