可能的重复项:
重载运算符作为成员函数还是非成员(友)函数?
在学习运算符重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 建议您使用第二种形式,用于不修改对象本身或基于提供的参数生成新值/对象的情况。