Перегрузка присваивания Compund (C ++) - PullRequest
0 голосов
/ 28 октября 2018

Я столкнулся с проблемой при передаче одного и того же объекта дважды по ссылке на функцию, один раз как константа и один раз как обычно (изменяемый).

Я хотел бы знать, каков наилучший способисправить такой код.(Удобный пример - перегрузка составных операторов присваивания).

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.

Интересно, как правильно реализовать такой код в целом.Должен ли я просто быть осторожным с реализацией, например, поддерживая временные переменные, или есть какое-нибудь лучшее общее решение для таких проблем?(Например, передать по значению)

1 Ответ

0 голосов
/ 28 октября 2018

Использовать скопированное значение (передать аргумент по значению):

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;
}
...