оператор присваивания в 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. Оператор присваивания по умолчанию ничего не очищает, это точно.
А обязательно ли перегружать? Конечно, не обязательно, надо смотреть по ситуации. Если есть члены-указатели - лучше все-таки перегрузить, во избежение утечек памяти.

Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с ответами на Ваш вопрос: Оператор присваивания C++

что значит в c# и j# ==(два равно)
бинарный оператор равенства

Т. е. равны ли аргументы справа и слева от него.
подробнее...

C++ Вопрос по конструктору копии или копирования
Конструктор копирования следует реализовать тогда, когда в классе существует указатель по которому
подробнее...
Ответ от 3 ответа[гуру]
Привет! Вот еще темы с похожими вопросами:
спросили в PRM системы
Зачем нужны двоеточия?
Двоето́чие — знак препинания в виде двух расположенных одна над другой точек (:),
подробнее...

ЧТО ТАКОЕ ОПЕРАТОРЫ В ИНФОРМАТИКЕ ДОСТУПНО
То же, что и в алгебре.
Вот операторы: +, -*, /. Вы можете объяснить, что они
подробнее...

Что обозначают ==(два равно) в С++? .
= оператор присваивания, int a = 5 ; int b = a ; cout <<a<<b; 55
== оператор
подробнее...
Операция присваивания в С++ на Википедии
Посмотрите статью на википедии про Операция присваивания в С++
 

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

Имя*

E-mail:*

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