继续上一个问题,我想问为什么在C++运算符覆盖中添加"朋友"形式是首选
总结一下:
对于加法运算符覆盖,有两种方法可以做到:
int operator+(Object& e);
friend int operator+(Object& left, Object& right);
Run Code Online (Sandbox Code Playgroud)
为什么第二个(朋友)形式是首选的?有什么好处?
非成员版本(朋友或其他)是首选,因为它可以支持运营商左侧和右侧的隐式转换.
给定一个可隐式转换为Object的类型:
struct Widget
{
operator Object() const;
};
Run Code Online (Sandbox Code Playgroud)
如果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 & )
Run Code Online (Sandbox Code Playgroud)
回应你的评论:
通过定义转换运算符Widget,我们通知编译器Widget可以将实例自动转换为实例Object.
Widget w;
Object o = w; // conversion
Run Code Online (Sandbox Code Playgroud)
在表达式中o + w,编译器Object::operator+( Object & )使用通过转换w为a 生成的参数进行调用Object.所以结果和写作一样o + w.operator Object().
但在表达式中w + o,编译器会查找Widget::operator+(不存在)或非成员operator+( Widget, Object ).后者可以通过将被称为w一个Object如上.