c++中重载+=运算符值不改变的问题

背景:今天在使用pair<int,int>时,想重载它的+=运算符,写成了如下形式:

pair<int,int> operator += (pair<int,int> a, pair<int,int> b)
{
	return make_pair(a.first+b.first,a.second+b.second);
}

结果发现在进行+=操作后,+=的左值并没有发生改变,

?

转念一想,使用操作符实际上可以理解为一次函数的调用,因此,我想得到的值作为返回值返回了,但我并没有去使用它,因此,我们可以这么写:

但是,这种写法显然不是我们想要的,因此,我们应该思考如何在重载函数内部改变a的值。

在我们现在这种写法下,在重载函数中的形参实际上只是实参在函数内部的一个副本,除了值相同外,形参与实参无其它联系,  因此,我们考虑用某种方式将实参传递到函数内部,常见的方法有两种:

引用传递:

指针传递:

当然,这个第二种写法并不是那么的自然,因此在重载函数中用引用来接受实参可能是一种比较理想的方法。

### 如何在编程语言中实现 `+=` 运算符重载 #### C++ 中的 `+=` 运算符重载C++中,可以通过定义成员函数或友元函数的方式重载`+=`运算符。通常情况下,在类内部作为成员函数重载更为常见。 对于自定义类`MyClass`来说,要支持`obj1 += obj2;`这样的语句,可以如下方式实现: ```cpp class MyClass { public: // 成员变量 int value; // 构造函数 MyClass(int val):value(val){} // 重载 "+=" 运算符 MyClass& operator+=(const MyClass &other){ this->value += other.value; return *this; } }; ``` 此代码片段展示了如何通过成员函数的形式来完成`+=`运算符重载[^3]。当执行`a += b;`时,实际上调用了`operator+=`方法,并将`b`传递给该方法中的参数`other`。注意这里返回的是当前对象自身的引用(`*this`)以便链式调用。 #### Java 中的 `+=` 运算符行为解析 Java并允许开发者直接重载任何运算符,但是它确实提供了类似于其他语言中`+=`的行为。例如,当我们看到像`strVar += anotherStr;`这样形式的操作时,实际上是编译器自动转换成了`strVar = strVar + anotherStr;`的过程[^4]。这种处理机制是由JVM底层负责实施的,因此需要程序员显式地去定义类似的运算符重载功能。 #### Python 中的 `+=` 运算符重载 Python也允许我们为自己的数据类型定制化`+=`运算符的行为。这通常是通过对特殊的方法名如`__iadd__()`进行覆盖而达成目的。 假设有一个简单的Vector类想要支持增量赋操作,则可按下列模式编写: ```python class Vector: def __init__(self, data): self.data = list(data) def __repr__(self): return f'Vector({self.data})' def __iadd__(self, other): if isinstance(other, (list,tuple)): self.data.extend(other) elif isinstance(other, Vector): self.data.extend(other.data) else: raise TypeError('Unsupported operand type(s)') return self ``` 这段脚本说明了怎样利用内置方法`__iadd__()`来自定义向量累加规则[^1]。每当遇到形似`vecA += vecB`或者`vecA += [some_elements]`的情况时就会触发相应的逻辑流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值