我试图了解加号的运算符重载。我看到2个原型:
Box operator+(const Box& b) { ... }
Box operator+(const Box& left, const Box& right) { ... }
哪一个是对的?如果区别仅在于第一个是成员函数而第二个是非成员函数,那么我可以说我定义了两种方式,那么将调用哪一种方式?
Box a, b;
Box c = a + b;
答案 0 :(得分:1)
什么是“正确”或“更好”取决于您的申请。成员版本允许访问Box
的所有私有属性和方法,非成员版本不会,除非它被声明为friend
Box
。但是非成员可以被模板化并且适用于各种类型。
编译器不会优先考虑成员而不是非成员,反之亦然。而是应用C ++ overload resolution rules来选择其中一个。
Box Box::operator+(const Box& b)
被视为需要两个参数:Box&
,它引用用于调用成员函数的对象(*this
)和const Box& b
。
在您的示例中,a
和b
都是非常量的。
为了调用Box Box::operator+(const Box& b)
,需要将b
转换为const引用。
要调用Box operator+(const Box& left, const Box& right)
,a
和b
都需要转换为const引用。
因此选择成员运算符是因为它更匹配(需要更少的转换)。
如果你的成员operator+
被宣布为const
,你就会遇到编译错误,因为调用会变得模棱两可。