2012-04-16 50 views
1

可能重复:
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

Does this [this](http://stackoverflow.com/q/1145022/220636)或[that](http://stackoverflow.com/q/8509046/220636)有帮助吗? – nabulke 2012-04-16 10:19:34

+0

@TonyDelroy谢谢我之前没有注意到它 – depecheSoul 2012-04-16 10:19:41

+1

@depecheSoul请不要标记通过在瓷砖中添加“已解决”回答的问题。接受最好的答案。看看常见问题以适应StackOverflow并在这里享受您的时间。 – pmr 2012-04-16 10:29:38

回答

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

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

+0

有趣。我认为这不是一个偏好问题,而只是必要性问题。例如,当你想实现'+ ='或'标量+类',你必须使用一种形式或其他。 – 2012-04-16 10:25:39