运算符重载加号登录C++

operator overloading of plus sign in C++

本文关键字:登录 C++ 重载 运算符      更新时间:2023-10-16

我正在尝试理解加号的运算符重载。我看到 2 个原型:

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

哪一个是对的?如果区别只是第一个是成员函数,第二个是非成员函数,那么假设我定义了两种方式,那么将调用哪一种方式?

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

什么是"正确"或"更好"取决于您的应用程序。成员版本可以访问Box的所有私有属性和方法,非成员版本不会,除非它被声明为Boxfriend。但是,非成员可以被模板化并使其应用于各种类型。

编译器通常不首选成员而不是非成员,反之亦然。相反C++应用重载解析规则来选择一个或另一个。

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

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

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

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

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

如果你的成员operator+被声明为const,你会得到一个编译器错误,因为调用会变得不明确。