C++运算符覆盖 - 为什么它是朋友的首选?

Joh*_*ing 5 c++

继续上一个问题,我想问为什么在C++运算符覆盖中添加"朋友"形式是首选

总结一下:

对于加法运算符覆盖,有两种方法可以做到:

int operator+(Object& e);
friend int operator+(Object& left, Object& right);
Run Code Online (Sandbox Code Playgroud)

为什么第二个(朋友)形式是首选的?有什么好处?

And*_*ard 5

非成员版本(朋友或其他)是首选,因为它可以支持运营商左侧和右侧的隐式转换.

给定一个可隐式转换为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如上.