2010-09-30 30 views
0

嘿,我想知道這兩個運營商定義的區別:運算符重載在C++(有和沒有朋友的)

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 

想要一些explenation的區別,謝謝!

+0

這些聲明是否在類中? – 2010-09-30 18:04:42

+0

您的#2甚至不需要成爲朋友 - 它不會訪問Rational的任何私人成員。它可以(也應該)完全在課堂之外聲明/定義。 – 2010-09-30 20:35:24

回答

3

大多數情況下,它們是相同的。

首先,我認爲你沒有書面權利。他們應該是:

// 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),它可轉化爲理性的對象,則:

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

將與第二個定義工作,但不是第一個。