Автор 000 задал вопрос в разделе Другие языки и технологии
Оператор присваивания C++ и получил лучший ответ
Ответ от Николай Веселуха[гуру]
Проблема с самоприсваиванием давно и легко решена:
#include <iostream>
#include <string>
using namespace std;
class user {
public:
user(string _key, string _value) : key(_key), value(_value) { }
user& operator=(const user&);
protected:
string key;
string value;
private:
user() { }
};
int main() {
user model("key", "value");
model = model;
cout << " All is well!" << endl;
cin.get();
return 0;
}
user& user::operator = (const user& rhs) {
if (this == &rhs) return *this; // решение!
this->key = rhs.key;
this->value = rhs.value;
return *this;
}
А вот деструктор нуждается в реализации только тогда когда в объекте предусмотрено динамическое выделение памяти. В этом случае нужно обязательно реализовать конструктор копирования, потому-что конструктор копирования по умолчанию будет копировать адреса указателей и каждая копия объекта будет ссылаться на одну и ту же область памяти. При удалении хотя бы одного из них все остальные потеряют доступ по указателю. Тем же грешит и оператор присваивания по умолчанию, который тупо копирует адреса указателей. Поэтому его следует перегружать в обязательном порядке. И наконец, выделенную однажды память следует освободить при разрушении объекта. Это делается при явной реализации деструктора.
Вывод: стоит единожды в классе написать new и тут же следует явно реализовать конструктор копирования, деструктор и перегрузить оператор присваивания.
Что за учебник? Нет кода, поэтому трудно что-то сказать. Вообще C/C++ отличается тем, что практически не делает неожиданных действий, вроде обнуления переменных, что, с одной стороны, ускоряет работу, с другой, приводит к UB. Оператор присваивания по умолчанию ничего не очищает, это точно.
А обязательно ли перегружать? Конечно, не обязательно, надо смотреть по ситуации. Если есть члены-указатели - лучше все-таки перегрузить, во избежение утечек памяти.