您可以重载所有基本的算术运算符:
+ 和 +=
- 和 -=
* 和 *=
/ 和 /=
& 和 &=
| 和 |=
^ 和 ^=
>> 和 >>=
<< 和 <<=
所有运算符的重载都是相同的。向下滚动以获取说明
class/以外的重载struct:
//应该以operator + =的形式实现operator + T operator+(T lhs, const T& rhs) { lhs += rhs; return lhs; } T& operator+=(T& lhs, const T& rhs) { //执行加法 return lhs; }
class/中的重载struct:
//应该以operator + =的形式实现operator + T operator+(const T& rhs) { *this += rhs; return *this; } T& operator+=(const T& rhs) { //执行加法 return *this; }
注意:operator+应该以非const值返回,因为返回引用没有意义(返回新对象)也不会返回const值(通常不应该返回by const)。第一个参数是按值传递的,为什么呢?因为
您不能修改原始对象(毕竟Object foobar = foo + bar;不应该修改foo,这没有任何意义)
您无法做到这一点const,因为您将必须能够修改该对象(因为operator+是根据operator+=修改了该对象的实现)
通过const&将是一个选项,但是随后您将必须为传递的对象制作一个临时副本。通过传递值,编译器将为您完成此任务。
operator+= 返回对自身的引用,因为这样可以链接它们(尽管不要使用相同的变量,由于序列点,这将是未定义的行为)。
第一个参数是一个引用(我们想对其进行修改),但不是const,因为这样您将无法对其进行修改。第二个参数不应修改,因此出于性能原因而传递const&(通过const引用传递比按值传递更快)。