Автор 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. Оператор присваивания по умолчанию ничего не очищает, это точно.
А обязательно ли перегружать? Конечно, не обязательно, надо смотреть по ситуации. Если есть члены-указатели - лучше все-таки перегрузить, во избежение утечек памяти.
что значит в c# и j# ==(два равно)
бинарный оператор равенства
Т. е. равны ли аргументы справа и слева от него.
подробнее...
C++ Вопрос по конструктору копии или копирования
Конструктор копирования следует реализовать тогда, когда в классе существует указатель по которому
подробнее...
дан условный оператор if a<5 then какое значение имеет переменная а, если в результ
При a=5 задаётся параметр
подробнее...
Как можно в паскале присвоить переменной буквенное значение?
Вот пример программы
Program pr;
Var c: char;
begin
c:='ф';
подробнее...
Зачем нужны двоеточия?
Двоето́чие — знак препинания в виде двух расположенных одна над другой точек (:),
подробнее...
ЧТО ТАКОЕ ОПЕРАТОРЫ В ИНФОРМАТИКЕ ДОСТУПНО
То же, что и в алгебре.
Вот операторы: +, -*, /. Вы можете объяснить, что они
подробнее...
Что обозначают ==(два равно) в С++? .
= оператор присваивания, int a = 5 ; int b = a ; cout <<a<<b; 55
== оператор
подробнее...