c++ - C++中加号的运算符重载

标签 c++ operator-overloading

<分区>

我正在尝试理解加号的运算符重载。我看到 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)属性和方法,非成员版本则不能,除非它被声明为 Boxfriend >。但是可以对非成员进行模板化,使其适用于范围广泛的类型。

编译器通常不会优先于非成员,反之亦然。相反 C++ overload resolution rules应用于选择一个或另一个。

Box Box::operator+(const Box& b) 被视为带有两个参数:Box& 指的是用于调用成员函数的对象 (*this), and const Box& b.

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

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

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

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

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

关于c++ - C++中加号的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43977788/

相关文章:

java - 使用 Android NDK 时如何管理多个 C++ 文件

c++ - OOP,赋值运算符不起作用

c++ - C 指针在递归中恢复到旧地址

c++ - 重载 "="使 obj2 = obj1 时不调用相等性

C++ 相等运算符由编译器自动重新定义

c++ - 有没有办法让 QXmlStreamReader 处理格式错误的 XML?

c++ - clang 格式在单行上捕获空语句

c++ - 覆盖 C++ 中的运算符重载?

c++ - 赋值运算符重载

c++ - std::set 包含对与自定义​​比较器