继续从上一个问题 https://stackoverflow.com/questions/12764696/operator-override-when-to-use-friend/12764769#comment17250263_12764769我想问为什么 C++ 运算符重写中的“朋友”形式的加法是首选
总结一下:
对于加法运算符覆盖,有两种方法可以实现:
int operator+(Object& e);
friend int operator+(Object& left, Object& right);
为什么首选第二种(朋友)形式?有什么优点?
非成员版本(friend 或其他)是首选,因为它可以支持运算符左侧和右侧的隐式转换。
给定一个可隐式转换为 Object 的类型:
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
,编译器调用Object::operator+( Object & )
带有通过转换生成的参数w
to an Object
。所以结果和写的一样o + w.operator Object()
.
但在表达中w + o
,编译器寻找Widget::operator+
(不存在)或非会员operator+( Widget, Object )
。后者可以通过转换来调用w
to an Object
如上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)