运算符在C ++中重载加号

时间:2017-05-15 11:01:30

标签: c++ operator-overloading

我试图了解加号的运算符重载。我看到2个原型:

Box operator+(const Box& b) { ... }
Box operator+(const Box& left, const Box& right) { ... }

哪一个是对的?如果区别仅在于第一个是成员函数而第二个是非成员函数,那么我可以说我定义了两种方式,那么将调用哪一种方式?

Box a, b;
Box c = a + b;

1 个答案:

答案 0 :(得分:1)

什么是“正确”或“更好”取决于您的申请。成员版本允许访问Box的所有私有属性和方法,非成员版本不会,除非它被声明为friend Box。但是非成员可以被模板化并且适用于各种类型。

编译器不会优先考虑成员而不是非成员,反之亦然。而是应用C ++ overload resolution rules来选择其中一个。

Box Box::operator+(const Box& b)被视为需要两个参数:Box&,它引用用于调用成员函数的对象(*this)和const Box& b

在您的示例中,ab都是非常量的。

为了调用Box Box::operator+(const Box& b),需要将b转换为const引用。

要调用Box operator+(const Box& left, const Box& right)ab都需要转换为const引用。

因此选择成员运算符是因为它更匹配(需要更少的转换)。

如果你的成员operator+被宣布为const,你就会遇到编译错误,因为调用会变得模棱两可。