Форум программистов, компьютерный форум CyberForum.ru

Как работает конструктор копирования? - C++

Восстановить пароль Регистрация
 
Supernatural
285 / 141 / 28
Регистрация: 22.11.2010
Сообщений: 1,441
21.06.2014, 02:05     Как работает конструктор копирования? #1
C++
1
2
3
4
5
6
ECM::ECM(const ECM &E)   //ГЄГ®Г*ñòðóêòîð êîïèðîâГ*Г*ГЁГї
{
if (E.type) {type= new char [strlen(E.type)+1]; strcpy(type, E.type);}
else type=0;
type=E.type;Ghz=E.Ghz;Memory=E.Memory;Gb=E.Gb;
}
Объясните как работает это механизм (конструктор копирования) и как его правильно вызвать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,733
Записей в блоге: 3
21.06.2014, 02:52     Как работает конструктор копирования? #2
По всей видимости в конструкторе по умолчанию предусмотрена инициализация поля Char *type ;//имя неудачное)
нулём. По сему первая строка в операторе if проверяет, что передан объект не созданный по умолчанию или во в сяком случае type указывает на память. Потом выделяется память соответствующая размеру строки в указателе type оригинала и по-молодецки (не проверяя выделилась ли память) в неё копируется из него строка. В случае если type оригинала равен нулю (никуда не указывает) он устанавливается в ноль и в создаваемом объекте. Потом копируются значения полей памяти и объёма харддиска. А вот кусочек type = E.type; это как серпом по я- чейкам памяти. То есть изначально предполагалось создание глубокой копии, а потом вдруг указатель установлен на указатель в оригинале. Конструктор копии трудится при передаче экземпляра в функцию по значению и при возврате, например. Если функция принимает и возвращает этот экземпляр, то уже из неё вернуться не светит. Будет пытаться освободить память 2-жды. Да ещё и принадлежащую по совместительству другому объекту. Это если деструктор написан логично.
Вкратце: удалите type = E.type; и уже будет работоспособно.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.06.2014, 08:39     Как работает конструктор копирования? #3
Supernatural, конструктор копирования используется при создании НОВОГО объекта как копии уже существующего. Вызывается в большинстве случаев неявно, например при передаче аргументов в функцию по значению.
Supernatural
285 / 141 / 28
Регистрация: 22.11.2010
Сообщений: 1,441
21.06.2014, 11:56  [ТС]     Как работает конструктор копирования? #4
Цитата Сообщение от Tulosba Посмотреть сообщение
конструктор копирования используется при создании НОВОГО объекта как копии уже существующего.
это понятно, но спасибо за напоминание, мне интересно то как мне следует копировать pECM[i]-ый элемент при таком определении КК. У меня есть отдельная процедура, которая должна копировать элемент, где кстати и используется КК.
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,209
Завершенные тесты: 1
21.06.2014, 12:04     Как работает конструктор копирования? #5
C++
1
2
ECM a;// Создаем объект на основе конструктора по умолчанию
ECM b(a);// Создаем объект через копиконструктор
Supernatural
285 / 141 / 28
Регистрация: 22.11.2010
Сообщений: 1,441
21.06.2014, 12:18  [ТС]     Как работает конструктор копирования? #6
я понял свою ошибку, все оказалось проще, чем я думал
Yandex
Объявления
21.06.2014, 12:18     Как работает конструктор копирования?
Ответ Создать тему
Опции темы

Текущее время: 11:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru