2010-09-30 82 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; 

将与第二个定义工作,但不是第一个。