组合分配重载(C ++)

时间:2018-10-28 02:54:42

标签: c++ operator-overloading parameter-passing

在将同一对象两次按引用传递给一个函数时遇到一个问题,一次是作为常量,一次是与往常一样(可变)。

我想知道修复此类代码的最佳方法是什么。 (一个方便的例子是重载复合赋值运算符)。

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 解决方案? (例如按值传递)

1 个答案:

答案 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;
}