【问题标题】:operator overloading of plus sign in C++ [duplicate]C ++中加号的运算符重载[重复]
【发布时间】:2017-10-14 03:18:47
【问题描述】:

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

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

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

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

【问题讨论】:

  • 试试看。 (填,填)
  • “假设我定义了两种方式”当你尝试它时发生了什么?
  • @RustyX:我不知道怎么做。

标签: c++ operator-overloading


【解决方案1】:

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

编译器通常不喜欢成员而不是非成员,反之亦然。而是应用 C++ overload resolution rules 来选择其中一个。

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 都需要转换为 const 引用。

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

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

【讨论】:

  • 另一个重要区别:非成员允许将左侧操作数隐式转换为Box;成员没有。
猜你喜欢
  • 2019-02-21
  • 2012-09-23
  • 1970-01-01
  • 2011-10-27
  • 2016-06-27
  • 1970-01-01
  • 2012-12-22
  • 2016-09-26
  • 2012-04-21
相关资源
最近更新 更多