конструктор копирования



Автор Лёха Федорович задал вопрос в разделе Другие языки и технологии

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)
Пожалуйста.

Ответ от Лиля Калиде[гуру]
зависит от того копируешь только конструкцию со значениями (под неё достаточно скопировать)
или конструкцию из вложенных объектов (да под те же копии массивов надо память выделять и их копировать - а если многоуровневые, то ещё веселее) .
так что для копирования классовых надо писать копирование всего внутреннего почленно учитывая где ссылки в этом классе. а где объекты

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

С++, как вызвать конструктор копирования из другого класса?
Для реализации собственного конструктора копирования должны быть веские причины, а именно –
подробнее...

Объясните мне указатели и ссылки в С++. Для чего они нужны?
Ссылка - накладная на товар. Передать накладную в бухгалтерию легче, чем притащить туда для
подробнее...

В чем отличии передачи парметров по ссылке от передачи параметров по значению?
Передача параметра по значению
Передача параметра по значению означает что вызывающая функция
подробнее...
спросили в User all User all 0
Оператор присваивания C++
Проблема с самоприсваиванием давно и легко решена:

#include <iostream>подробнее...
Ответ от 3 ответа[гуру]
Привет! Вот еще темы с похожими вопросами:

Как Яндекс. Карту вставить на сайт? Не найду ссылку для копирования iframe Короткие ссылки есть, а iframe не найду.
Заходишь в яндекс. карты, там на юго-западе есть сслыка "API", заходишь туда, а там в центральном
подробнее...

В каких странах и городах есть целые кварталы скопированные с европейских городов?
Тяга китайцев к дословному копированию образцов западной цивилизации не знает предела. В
подробнее...
спросили в Ford
Вопрос по авто истории : Была ли "ВОЛГА" ГАЗ-м21 плагиатом на Ford "Mainline"?
Вопрос, конечно, интересный, во многом очень спорный.
Отвечу так - Волга ГАЗ-м21 ОЧЕНЬ сильно
подробнее...
спросили в Кирсанов
Как импортировать в Access таблицу Exсel?
Открыть (создать) базу данных Access.
Меню Файл-Внешние данные-Импорт
поменять тип файлов
подробнее...
спросили в Live USB
При загрузке установки Windows XP c USB Flash Drive пишет "inf-файл txtsetup.sif испорчен или отсутствует, состояние 18"
Windows XP USB Flash Edition - хотите пришлю, то что есть у меня, может поможет!
Эта сборка
подробнее...

Почему СССР был технолог. очень отсталой страной?
Мне кажется, что начинать надо ещё с периода индустриализации страны в 30-е годы прошлого века.
подробнее...

На чем лучше создать лендинг пейдж?
Нет, конструкторы сразу в сторону! Они слишком уж примитивные,. я не говорю, что нужно создавать
подробнее...
спросили в Дружба Soweto Open
работа в интернете правда или обман
У Вас есть два варианта: или заработать на своем сайте (проекте) или заработать участвуя в чужих
подробнее...

Откуда и как появился запорожец
Запоро́жец (в оригинальном написании «Запорожець» ) — марка советских и украинских легковых
подробнее...
Конструктор копирования на Википедии
Посмотрите статью на википедии про Конструктор копирования
 

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

Имя*

E-mail:*

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