<分区>
我正在尝试理解加号的运算符重载。我看到 2 个原型(prototype):
Box operator+(const Box& b) { ... }
Box operator+(const Box& left, const Box& right) { ... }
哪个是对的?如果区别仅在于 first 是成员函数而 second 是非成员函数,那么假设我定义了两种方式,那么将调用哪一种?
Box a, b;
Box c = a + b;
<分区>
我正在尝试理解加号的运算符重载。我看到 2 个原型(prototype):
Box operator+(const Box& b) { ... }
Box operator+(const Box& left, const Box& right) { ... }
哪个是对的?如果区别仅在于 first 是成员函数而 second 是非成员函数,那么假设我定义了两种方式,那么将调用哪一种?
Box a, b;
Box c = a + b;
最佳答案
什么是“正确”或“更好”取决于您的应用。成员版本可以访问 Box
的所有私有(private)属性和方法,非成员版本则不能,除非它被声明为 Box
的 friend
>。但是可以对非成员进行模板化,使其适用于范围广泛的类型。
编译器通常不会优先于非成员,反之亦然。相反 C++ overload resolution rules应用于选择一个或另一个。
Box Box::operator+(const Box& b)
被视为带有两个参数:Box&
指的是用于调用成员函数的对象 (*this
), and 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
,您将遇到编译器错误,因为调用会变得不明确。
关于c++ - C++中加号的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43977788/