在将同一对象两次按引用传递给一个函数时遇到一个问题,一次是作为常量,一次是与往常一样(可变)。
我想知道修复此类代码的最佳方法是什么。 (一个方便的例子是重载复合赋值运算符)。
class MyClass
{
int a, b;
public:
MyClass(int a, int b) : a(a), b(b) {}
MyClass& operator+=(const MyClass& ob)
{
this->a += ob.b;
this->b += ob.a;
return *this;
}
};
当然,这段代码没有多大意义,但它突出了问题所在: 编写以下代码时:
MyClass ob(1, 2);
ob += ob;
我希望ob.b的值为3,但值为5。
我想知道通常如何正确实现这样的代码。 我是否应该对实现加以谨慎,例如维护临时变量,或者对于此类问题是否有更好的 general 解决方案? (例如按值传递)
答案 0 :(得分:0)
使用复制的值(按值传递参数):
MyClass& operator+=(const MyClass ob)
或更优化的解决方案:如果对象是同一对象,则比较对象地址并使用临时值:
MyClass& operator+=(const MyClass& ob)
{
if (this == std::addressof(ob))
return operator+=(MyClass(ob));
this->a += ob.b;
this->b += ob.a;
return *this;
}