可能重复:
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);
}
谢谢!!!
答案 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建议您使用第二种形式,以防您不自行修改对象或根据提供的参数生成新值/对象的情况。