如何返回重载二元运算符的值

时间:2012-12-11 22:53:09

标签: c++ c++11

  

可能重复:
  How to deduce the type of the functor’s return value?

给出以下示例:

<type>& operator+(const <type>& rhs) {
   // *this.data + rhs
}

如何在&lt;类型的对象中返回求和的值?键入&GT ;?

如果我编码:

<type>& operator+(const <type>& rhs) {
   <type> cell;
   switch(rhs.type {
   case DOUBLE:
   {
     cell.data = (double)cell.data + (double)rhs.data;  
   }
   return cell;
}

我返回一个临时堆栈值,并收到错误消息。

如果我编码:

<type>& operator+(const <type>& rhs) {
  *this.data = *this.field + rhs.data;
  return *this;
}

我覆盖了这不是添加的意图。

这只是一个例子。 '真正的'代码要求我能够添加(减去,...)任意数量的输入数据类型,这反过来要求返回值能够容纳几种类型的任何数据,它可以做和做

2 个答案:

答案 0 :(得分:11)

operator+应按值返回,而不是按引用返回。由于操作员不应修改左侧或右侧,因此需要修改第三个对象。你必须在函数内创建一个。由于您无法返回对局部变量的引用,因此最好的方法是按值返回。

<type> operator+(const <type> &rhs) {
  <type> sum = *this;
  sum.data = sum.data + rhs.data;
  return sum;
}

相反,operator+=应该通过引用返回,因为+=应该修改左侧。

<type> &operator+= (const <type> &rhs) {
    this->data += rhs.data;
    return *this;
}

然后,您可以使用+

来实施+=
<type> operator+(const <type> &rhs) {
  <type> sum = *this;
  return sum += rhs;
}

此外,通常operator+将作为非成员函数实现,以便左右两侧的转换都能正常工作。左侧的成员函数转换不被认为是相同的。

<type> operator+(<type> lhs, const <type> &rhs) {
    return lhs += rhs;
}

另外,通过这种方式,您可以按左侧取值,也可以利用复制/移动省略。

答案 1 :(得分:0)

最简单且可能最好的方法是将返回类型从<type>&更改为<type>