При перегрузке оператора
= в C++ принято возвращать ссылку на текущий объект (*this). Это позволяет цепочечное присваивание (a = b = c), а также улучшает производительность и удобство использования. 🚩Правильная сигнатура оператора `=`
class MyClass {
public:
MyClass& operator=(const MyClass& other) {
if (this != &other) { // Защита от самоприсваивания
// Копируем данные
}
return *this; // Возвращаем ссылку на текущий объект
}
};🚩Что даёт возвращение ссылки (`T&`)?
Поддержка цепочки присваивания (
a = b = c)a = b = c; // Интерпретируется как a = (b = c);
Пример
#include <iostream>
class MyClass {
public:
int value;
MyClass(int v) : value(v) {}
MyClass& operator=(const MyClass& other) {
if (this != &other) { // Защита от самоприсваивания
value = other.value;
}
return *this;
}
};
int main() {
MyClass a(1), b(2), c(3);
a = b = c; // Работает, потому что `b = c` возвращает ссылку на `b`
std::cout << "a: " << a.value << ", b: " << b.value << ", c: " << c.value << std::endl;
}
Вывод
a: 3, b: 3, c: 3
🟠Убираем лишнее копирование (повышаем производительность)
Если оператор
= вернёт не ссылку, а объект, то произойдёт лишнее копирование. Плохо (возвращаем объект, а не ссылку)
MyClass operator=(const MyClass& other) { // ⚠️ Ошибка: возвращаем объект
value = other.value;
return *this; // Здесь создаётся временный объект (лишняя копия!)
}Хорошо (возвращаем
T&) MyClass& operator=(const MyClass& other) { // ✅ Возвращаем ссылку
value = other.value;
return *this;
}🚩Поддержка `if (a = b)`
Если оператор
= вернёт ссылку, мы можем использовать его в условии: if ((a = b).value == 42) { // ОК
std::cout << "Присваивание выполнено, a == 42";
}🚩Что если вернуть `void`?
Если оператор
= вернёт void, цепочка a = b = c; не будет работать. class MyClass {
public:
void operator=(const MyClass& other) { // ⚠️ Ошибка!
value = other.value;
}
};
int main() {
MyClass a, b, c;
a = b = c; // ❌ Ошибка: `b = c` возвращает void, а `a = void` не работает!
}Ставь 👍 и забирай 📚 Базу знаний