什么代码更适合用于运算符重载

时间:2012-04-16 10:12:04

标签: c++ operator-overloading operator-keyword

  

可能重复:
  Overload operators as member function or non-member (friend) function?

在学习C ++中的运算符重载的过程中,我看到了两种不同类型的重载operator +。

我需要你的帮助告诉我哪种方法更好用: 方法第一:

Complex Complex::operator + (Complex &obj) {
   return Complex( re + obj.re, im + obj.im );
}

方法第二:

Complex operator + (const Complex &obj1, const Complex &obj2) { 
    // this function is friend of class complex
    return Complex(obj1.re + obj2.re, obj1.im + obj2.im);
}

谢谢!!!

2 个答案:

答案 0 :(得分:4)

只要没有隐含的转换,两者都同样好; 这更像是品味问题。如果可以进行隐式转换 Complex(在这种情况下似乎很可能),然后是第一种形式, 隐式转换只适用于第二个参数,例如:

Complex c;
Complex d;

d = c + 1.0;    //  Works in both cases...
d = 1.0 + c;    //  Only works if operator+ is free function

在这种情况下,自由功能是目前的首选解决方案;许多 由于正交性原因,人们更喜欢系统地使用它。

在许多这样的情况下,事实上,自由函数operator+将是 以operator+=(将成为会员)的方式实施:

Complex
operator+( Complex const& lhs, Complex const& rhs )
{
    Complex results( lhs );
    results += rhs;
    return results;
}

事实上,提供模板基类非常简单 它自动提供所有这些操作员。 (在这种情况下, 它们被声明为friend,以便在它们中排列 模板基类。)

答案 1 :(得分:1)

Bjarne Stroustrup建议您使用第二种形式,以防您不自行修改对象或根据提供的参数生成新值/对象的情况。