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



可能的重复项:
重载运算符作为成员函数还是非成员(友)函数?

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

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

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

谢谢!!!

只要不能有隐式转换,两者都同样好;这更多的是品味问题。 如果可以隐式转换为 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,以便将它们定义在模板基类。

Bjarne Stroustrup 建议您使用第二种形式,用于不修改对象本身或基于提供的参数生成新值/对象的情况。

最新更新