接着上一个问题,我想问为什么在C++操作符重载中更倾向于使用“友元”形式的加法。
总结一下:
对于加法操作符重载,有两种方法:
int operator+(Object& e);
friend int operator+(Object& left, Object& right);
为什么第二个(好友)表单更受青睐?有哪些优点?
struct Widget
{
operator Object() const;
};
仅当Widget
的实例出现在左侧时,才能调用非成员版本:
Widget w;
Object o;
o + w; // can call Object::operator+( Object & ) since left-hand side is Object
w + o; // can only call operator+( Object &, Object & )
针对您的评论:
通过在 Widget
中定义转换运算符,我们通知编译器可以自动将 Widget
实例转换为 Object
实例。
Widget w;
Object o = w; // conversion
o + w
中,编译器使用将w
转换为Object
所生成的参数,调用Object::operator+( Object & )
。因此,结果与写o + w.operator Object()
相同。w + o
中,编译器会查找不存在的Widget::operator+
或者非成员operator+( Widget, Object )
。后者可以通过像上面那样将w
转换为Object
来调用。Object& operator+(int& offset);