Ну, результаты a += b;
должны быть эквивалентны a = a + b;
;
так как вы уже определили operator+
, вы знаете, что это
семантика есть. Если общепринятой практикой является определение operator+=
первым,
а затем реализовать operator+
(обычно в качестве свободной функции) с точки зрения
+=
MyClass
operator+( MyClass const& lhs, MyClass const& rhs )
{
MyClass results( lhs );
results += rhs;
return results;
}
Затем вы определяете operator+=
, чтобы воздействовать непосредственно на членов класса:
MyClass&
MyClass::operator+=( MyClass const& other )
{
n += other.n;
razmer += other.razmer;
// ...
return *this;
}
(Хотя есть веские причины сделать его нечленом,
традиционно operator+=
является членом. Наверное потому что operator=
должен быть участником.)
Также, традиционно, operator+=
возвращает ссылку, потому что это
больше всего напоминает поведение оператора на встроенных типах.
Наконец, совершенно другая проблема: вам не хватает копии
конструктор (который в вашем случае означает двойное удаление, если вы делаете копирование),
и ваш operator=
сломан (подумайте, что произойдет, если x =
new int[b.n];
потерпит неудачу и выбросит std::bad_alloc
). Классический
Решением для этого было бы реализовать глубокую копию в копии
конструктор (используя более или менее ту же логику, которую вы используете при настройке
переменные в вашем операторе присваивания), и в операторе присваивания,
чтобы создать копию, а затем поменять местами элементы. Это не строго
необходимо, но что бы вы ни делали, вы должны сделать new
(и все остальное
может произойти сбой) до изменения значений в назначаемом объекте.
(Если вы сделаете это, тест для самостоятельного назначения бесполезен; необходимость в
Тест на присваивание обычно является сигналом того, что оператор присваивания
сломана.)