Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 27.04.2015
Сообщений: 9

Оператор присваивания через конструктор

06.02.2016, 15:43. Показов 1616. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Насколько плохо (или совсем не плохо) реализовывать операторы присваивания через соответствующие конструкторы с помощью placement new? Могут ли возникнуть какие-то проблемы и не считается ли это дурным тоном? Кажется, это самый простой и эффективный способ реализовать operator=, который я знаю, но почему-то не встречал это где-то еще.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct A {
    A() { /*...*/ }
    A(const A &other) { /*...*/ }
    A(A &&other) { /*...*/ }
 
    ~A() { /*...*/ }
 
    A &operator=(const A &other) {
        if (this != &other) {
            this->~A();
            new (this) A(other);
        }
        return *this;
    }
 
    A &operator=(A &&other) {
        if (this != &other) {
            this->~A();
            new (this) A(std::forward<A>(other));
        }
        return *this;
    }
};
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.02.2016, 15:43
Ответы с готовыми решениями:

Оператор присваивания через конструктор копирования
Возник такой вопрос. Как перегрузить оператор присваивания для класса через конструктор копирования. Когда попытался сам, то сделал...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор *
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Конструктор копирования и оператор присваивания
Есть класс (синтетический, создан для примера) class Object { private: int a; float b; public: Object(): a(0),...

6
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
06.02.2016, 16:03
это плохо
1
0 / 0 / 0
Регистрация: 27.04.2015
Сообщений: 9
06.02.2016, 16:11  [ТС]
Kastaneda, Но ведь в "copy & swap" если что-то пойдет не так при создании временного объекта, состояние левого операнда так же останется неопределенно. В чем разница?
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
06.02.2016, 16:19
Kastaneda
Помню, Герб ещё писал, что если в операторе присваивания встречается конструкция if (this != &other), то что-то идёт не так, не говоря уже о том, что & может быть перегружен.

Добавлено через 1 минуту
Андрей Тонких
Если у Вас в swap что-то пошло не так -- вашей программе пора разрушиться. По-моему так...
1
0 / 0 / 0
Регистрация: 27.04.2015
Сообщений: 9
06.02.2016, 16:22  [ТС]
mporro, я так понял (из поста по ссылке), что проблема с тем, что new может не сработать и тогда если реализовывать с помощью вызова деструктора, наш объект остается в непонятном состоянии. Но разве эта проблема решается в идиоме "copy & swap"?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
06.02.2016, 17:05
Лучший ответ Сообщение было отмечено Андрей Тонких как решение

Решение

Цитата Сообщение от Андрей Тонких Посмотреть сообщение
Но разве эта проблема решается в идиоме "copy & swap"?
Да. При условии, что swap - nothrow.
Вот тут уже был этот вопрос: Использование placement-new в перегруженном операторе присваивания

Цитата Сообщение от Андрей Тонких Посмотреть сообщение
Но ведь в "copy & swap" если что-то пойдет не так при создании временного объекта, состояние левого операнда так же останется неопределенно.
Нет, оно будет определено: останется таким же, как и до. swap при этом должен быть небросающим исключения (обычно это легко обеспечить).
1
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
06.02.2016, 18:04
Андрей Тонких
Много текста на английском, зато подробно...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.02.2016, 18:04
Помогаю со студенческими работами здесь

Конструктор копий. Оператор присваивания
В классе есть массив char (не динамический) размером 40 байт. Вопрос1: нужно ли для такого класса определять конструктор копий или...

Конструктор копирования и оператор присваивания
Не понимаю, когда используется один, а когда другой. Написал простой пример с комплексными числами - при компиляции в VS2010 и CodeBlock 10...

Перемещающий конструктор и оператор перемещающего присваивания
Правильно у меня написаны перемещающий конструктор и оператор присваивания? И исправьте ошибку в операторе &quot;ссылка rvalue не может...

Про конструктор копирования, оператор присваивания
Объясните, пожалуйста, принцип действия конструктора копирования и операции присваивания. На что указывает указатель this в этих функциях?...

Очередь, конструктор копирования и перегруженный оператор присваивания
#include &lt;iostream&gt; using namespace std; typedef char type; struct Node { type element; Node *pNext; };


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru