В чем разница между операторами присваивания в C++?

«В чем разница между операторами присваивания в C++?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В C++ существует базовый оператор присваивания = и семейство составных операторов присваивания (+=, -=, *=, /=, %=, <<=, >>=, &=, |=, ^=).

Семантическая разница:

  • x = y;Простое присваивание. Присваивает значение правого операнда (y) левому (x).
  • x += y;Составное присваивание. Эквивалентно x = x + y;, но записывается компактнее.

Техническая разница (особенно для пользовательских типов): Для встроенных типов (int, double) разницы в результате нет, но составные операторы могут быть эффективнее для сложных объектов, так как позволяют избежать создания временного объекта.

Пример с перегрузкой для пользовательского класса:

class Vector {
public:
    Vector& operator+=(const Vector& other) { // Составное присваивание
        // Модифицируем текущий объект напрямую.
        this->x += other.x;
        this->y += other.y;
        return *this; // Возвращаем ссылку на себя
    }
    // Обычный оператор сложения, реализованный через += (идиома copy-and-swap)
    Vector operator+(const Vector& other) const {
        Vector temp = *this; // Создаём копию
        temp += other;       // Используем уже реализованный +=
        return temp;         // Возвращаем новую копию
    }
private:
    double x, y;
};

int main() {
    Vector a, b, c;
    c = a + b; // Вызывает operator+, создаёт временный объект.
    a += b;    // Вызывает operator+=, работает напрямую с 'a', эффективнее.
    return 0;
}

Вывод: Составные операторы не только улучшают читаемость, но и зачастую являются более эффективной идиомой, особенно при проектировании классов.