运算符在c ++中重载(有和没有朋友)

时间:2010-09-30 18:01:21

标签: c++ operators operator-overloading unary-operator

嘿,我想知道这两个运算符定义之间的区别:

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 个答案:

答案 0 :(得分: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)可以转换为Rational对象,那么:

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

将使用第二个定义,但不适用于第一个定义。