Автор Лёха Федорович задал вопрос в разделе Другие языки и технологии
C++ Вопрос по конструктору копии или копирования и получил лучший ответ
Ответ от Николай Веселуха[гуру]
Конструктор копирования следует реализовать тогда, когда в классе существует указатель по которому динамически выделяется память. В этом случае при копировании полей объектов стандартным конструктором копирования будут копироваться только адреса указателей и оба объекта будут указывать на одну и ту же область памяти. Такое поведение бывает нужно, но в большинстве случаев приводит к ошибкам. Следует применять глубокое копирование объектов, которое заключается в том, что в конструкторе копирования данные из объекта в объект копируются по разыменованным указателям. *this здесь вообще не при делах. Он нужен он вам будет при перегрузке оператора присваивания, где по нему, разыменованному, будет возвращаться ссылка на объект. Не следует забывать и о деструкторе, который также необходим, чтобы убрать за собой в памяти, когда ваш объект вам больше не пригодится в дальнейшем.
#include < iostream> // лишний пробел - взятка синтаксическому анализатору Ответов Mail.Ru
using namespace std;
class myclass {
int* p;
public:
myclass() : p(new int) { *p = 0; }
explicit myclass(int i) : p(new int) { *p = i; }
myclass(const myclass& obj) : p(new int) { *p = *obj.p; }
~myclass() { if (p) { delete p; p = nullptr; } }
myclass& operator=(const myclass& obj) {
if (&obj != this) { p = new int; *p = *obj.p; }
return *this;
}
int getval()const { return *p; }
};
void display(myclass);
int main() {
myclass a(10); // вызов конструктора с параметром
display(a); // убеждаемся, что он работает
myclass b = a; // вызов конструктора копирования
a.~myclass(); // освобождаем ресурсы под первый объект
a.~myclass(); // повторная попытка скажет о том, что деструктор реализован правильно
display(b); // убеждаемся что конструктор копирования работает правильно
myclass c; // вызов конструктора без параметров
b = b; // вызов оператора присваивания, тестируем возможность самоприсваивания
c = b; // вызов оператора присваивания
b.~myclass(); // освобождаем ресурсы второго объекта
display(c); // убеждаемся в том, что оператор присваивания работает верно
cin.get();
}
void display(myclass o) { cout << o.getval() << endl; }
Николай Веселуха
Высший разум
(201595)
Пожалуйста.
зависит от того копируешь только конструкцию со значениями (под неё достаточно скопировать)
или конструкцию из вложенных объектов (да под те же копии массивов надо память выделять и их копировать - а если многоуровневые, то ещё веселее) .
так что для копирования классовых надо писать копирование всего внутреннего почленно учитывая где ссылки в этом классе. а где объекты
С++, как вызвать конструктор копирования из другого класса?
Для реализации собственного конструктора копирования должны быть веские причины, а именно –
подробнее...
Объясните мне указатели и ссылки в С++. Для чего они нужны?
Ссылка - накладная на товар. Передать накладную в бухгалтерию легче, чем притащить туда для
подробнее...
В чем отличии передачи парметров по ссылке от передачи параметров по значению?
Передача параметра по значению
Передача параметра по значению означает что вызывающая функция
подробнее...
Оператор присваивания C++
Проблема с самоприсваиванием давно и легко решена:
#include <iostream>
подробнее...
Где купить лего-совместимый конструктор, чтобы были только строительные блоки? Надо много Посоветуйте интернет-магазин
#yaimg602933#
Аналогами Lego считаются:
• Brick (Enlighten) - самостоятельный китайский
подробнее...
Как Яндекс. Карту вставить на сайт? Не найду ссылку для копирования iframe Короткие ссылки есть, а iframe не найду.
Заходишь в яндекс. карты, там на юго-западе есть сслыка "API", заходишь туда, а там в центральном
подробнее...
В каких странах и городах есть целые кварталы скопированные с европейских городов?
Тяга китайцев к дословному копированию образцов западной цивилизации не знает предела. В
подробнее...
Вопрос по авто истории : Была ли "ВОЛГА" ГАЗ-м21 плагиатом на Ford "Mainline"?
Вопрос, конечно, интересный, во многом очень спорный.
Отвечу так - Волга ГАЗ-м21 ОЧЕНЬ сильно
подробнее...
Посоветуйте бесплатный хостинг/блогохостинг с привязкой своего домена.
* sevhosting.net - 35 Мб, php, база My SQL
* eomy.net - 300 Мб, php, базы My SQL
*
подробнее...
Как импортировать в Access таблицу Exсel?
Открыть (создать) базу данных Access.
Меню Файл-Внешние данные-Импорт
поменять тип файлов
подробнее...
При загрузке установки Windows XP c USB Flash Drive пишет "inf-файл txtsetup.sif испорчен или отсутствует, состояние 18"
Windows XP USB Flash Edition - хотите пришлю, то что есть у меня, может поможет!
Эта сборка
подробнее...
Почему СССР был технолог. очень отсталой страной?
Мне кажется, что начинать надо ещё с периода индустриализации страны в 30-е годы прошлого века.
подробнее...
На чем лучше создать лендинг пейдж?
Нет, конструкторы сразу в сторону! Они слишком уж примитивные,. я не говорю, что нужно создавать
подробнее...
работа в интернете правда или обман
У Вас есть два варианта: или заработать на своем сайте (проекте) или заработать участвуя в чужих
подробнее...
Откуда и как появился запорожец
Запоро́жец (в оригинальном написании «Запорожець» ) — марка советских и украинских легковых
подробнее...