оператор присваивания в c



Автор 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;
&nbsp;&nbsp;&nbsp;&nbsp;cout << " All is well!" << endl;
&nbsp;&nbsp;&nbsp;&nbsp;cin.get();
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}
user& user::operator = (const user& rhs) {
&nbsp;&nbsp;&nbsp;&nbsp;if (this == &rhs) return *this; // решение!
&nbsp;&nbsp;&nbsp;&nbsp;this->key = rhs.key;
&nbsp;&nbsp;&nbsp;&nbsp;this->value = rhs.value;
&nbsp;&nbsp;&nbsp;&nbsp;return *this;
}
А вот деструктор нуждается в реализации только тогда когда в объекте предусмотрено динамическое выделение памяти. В этом случае нужно обязательно реализовать конструктор копирования, потому-что конструктор копирования по умолчанию будет копировать адреса указателей и каждая копия объекта будет ссылаться на одну и ту же область памяти. При удалении хотя бы одного из них все остальные потеряют доступ по указателю. Тем же грешит и оператор присваивания по умолчанию, который тупо копирует адреса указателей. Поэтому его следует перегружать в обязательном порядке. И наконец, выделенную однажды память следует освободить при разрушении объекта. Это делается при явной реализации деструктора.
Вывод: стоит единожды в классе написать new и тут же следует явно реализовать конструктор копирования, деструктор и перегрузить оператор присваивания.

Ответ от Капитан Гугл[гуру]
Что за учебник? Нет кода, поэтому трудно что-то сказать. Вообще C/C++ отличается тем, что практически не делает неожиданных действий, вроде обнуления переменных, что, с одной стороны, ускоряет работу, с другой, приводит к UB. Оператор присваивания по умолчанию ничего не очищает, это точно.
А обязательно ли перегружать? Конечно, не обязательно, надо смотреть по ситуации. Если есть члены-указатели - лучше все-таки перегрузить, во избежение утечек памяти.

Ответ от 22 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: Оператор присваивания C++
Операция присваивания в С++ на Википедии
Посмотрите статью на википедии про Операция присваивания в С++
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*