Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Supernatural
604 / 203 / 30
Регистрация: 22.11.2010
Сообщений: 1,585
Записей в блоге: 1
#1

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

21.06.2014, 02:05. Просмотров 375. Ответов 5
Метки нет (Все метки)

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;
}
Объясните как работает это механизм (конструктор копирования) и как его правильно вызвать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2014, 02:05
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как работает конструктор копирования? (C++):

Как работает конструктор копирования - C++
дан класс я не могу понять как работает конструктор копирования arr.h#pragma once #include <iostream> #include <fstream> #include...

Конструктор копирования не работает - C++
Прошу вас помочь разобраться с конструктором копирования. Проблема в следующем при вызове конструктора копирование вылетает ошибка не...

Не работает конструктор копирования - C++
Всем доброго времени суток. Помогите пожалуйста, уже битиый день не могу побороть почему не работает конструктор копирования :cry: ...

Не работает конструктор копирования - C++
#include <iostream.h> #include <conio.h> #include <stdio.h> class my {int x1,x2,y1,y2,col; public: my(int _x1=20, int _y1=5,...

Не работает конструктор копирования - C++
Пишу свой класс матрица. В конструкторе копирования вылезла ошибка, решить которую мне не удается. Отладчиком проходился не один раз,...

Не работает конструктор копирования почему-то... - C++
#include "stdlib.h" #include "stdio.h" #include <iostream> #include <cstddef> using namespace std; class Top { public: ...

5
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6967 / 3258 / 327
Регистрация: 04.12.2011
Сообщений: 9,016
Записей в блоге: 5
21.06.2014, 02:52 #2
По всей видимости в конструкторе по умолчанию предусмотрена инициализация поля Char *type ;//имя неудачное)
нулём. По сему первая строка в операторе if проверяет, что передан объект не созданный по умолчанию или во в сяком случае type указывает на память. Потом выделяется память соответствующая размеру строки в указателе type оригинала и по-молодецки (не проверяя выделилась ли память) в неё копируется из него строка. В случае если type оригинала равен нулю (никуда не указывает) он устанавливается в ноль и в создаваемом объекте. Потом копируются значения полей памяти и объёма харддиска. А вот кусочек type = E.type; это как серпом по я- чейкам памяти. То есть изначально предполагалось создание глубокой копии, а потом вдруг указатель установлен на указатель в оригинале. Конструктор копии трудится при передаче экземпляра в функцию по значению и при возврате, например. Если функция принимает и возвращает этот экземпляр, то уже из неё вернуться не светит. Будет пытаться освободить память 2-жды. Да ещё и принадлежащую по совместительству другому объекту. Это если деструктор написан логично.
Вкратце: удалите type = E.type; и уже будет работоспособно.
1
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
21.06.2014, 08:39 #3
Supernatural, конструктор копирования используется при создании НОВОГО объекта как копии уже существующего. Вызывается в большинстве случаев неявно, например при передаче аргументов в функцию по значению.
2
Supernatural
604 / 203 / 30
Регистрация: 22.11.2010
Сообщений: 1,585
Записей в блоге: 1
21.06.2014, 11:56  [ТС] #4
Цитата Сообщение от Tulosba Посмотреть сообщение
конструктор копирования используется при создании НОВОГО объекта как копии уже существующего.
это понятно, но спасибо за напоминание, мне интересно то как мне следует копировать pECM[i]-ый элемент при таком определении КК. У меня есть отдельная процедура, которая должна копировать элемент, где кстати и используется КК.
0
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 1
21.06.2014, 12:04 #5
C++
1
2
ECM a;// Создаем объект на основе конструктора по умолчанию
ECM b(a);// Создаем объект через копиконструктор
1
Supernatural
604 / 203 / 30
Регистрация: 22.11.2010
Сообщений: 1,585
Записей в блоге: 1
21.06.2014, 12:18  [ТС] #6
я понял свою ошибку, все оказалось проще, чем я думал
0
21.06.2014, 12:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2014, 12:18
Привет! Вот еще темы с ответами:

Класс матрица (не работает конструктор копирования) - C++
так вот,что-то глючит конструктор копирования, хотя ошибок компиляции не дает(( #include <fstream> #include <iostream> #include...

Неправильно работает конструктор копирования list, почему? - C++
#include <windows.h> #include <stdio.h> #include <list> #include <iterator> #include <iostream> using namespace std; list...

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования - C++
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику - C++
#include "stdafx.h" #include <iostream> #include <conio.h> #include <windows.h> #include <math.h> #include <algorithm> using...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru