在C ++中为两个/两个以上的对象重载了加法赋值运算符?

时间:2012-06-22 17:49:21

标签: c++ operator-overloading

我像这样重载了+运算符

class sample
{
private : 
  int x;
public :
  sample(int x1 =0)
  {
    x = x1;
  }

  sample operator+(sample s);
};

sample sample::operator+(sample s)
{
  x = x + s.x;
  return *this;
}

int  main()
{
  sample s1(10);
  sample s2;
  s2 = s2 + s1;
  return 0;    
}

这是对的吗? 我的问题是如果我想添加两个不同的样本对象,我将如何重载opeartor;例如s = s1 + s2;

我想用现有的实现来做s = s + s1 + s2

1 个答案:

答案 0 :(得分:20)

使用友元运算符重载应该为你做的技巧,并且是定义二元运算符的常用方法,只需添加:

friend sample operator+(const sample& a, const sample& b); //in class

sample operator+(const sample& a, const sample& b) { //outside the class
    return sample(a.x + b.x);
}

如果你希望它仍然是一个成员,(在一些罕见的情况下有缺点,没有上升空间),你必须使操作符成为const函数:

sample operator+(sample s) const; //in class

sample sample::operator+(const sample& b) const { //outside the class
    return sample(this->x + b.x);
}

其中任何一个都允许操作员链接。您之前的s = s + s1 + s2失败的原因是s + s1会执行并返回临时 sample对象。然后,它会尝试将s2添加到该样本中。但是,临时值只能是const引用 [1] ,因此,只能使用const成员函数。由于您的operator+成员函数不是const函数,因此您无法在const临时函数上使用该函数。请注意,要使其const,我必须重写它,因为您的版本会修改+左侧的对象。

[1]有例外在这里并不特别相关,即rvalues