我像这样重载了+运算符
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
。
答案 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