-12 / 0 / 4
Регистрация: 04.10.2014
Сообщений: 272
|
|
1 | |
Конструктор копирования при инициализации23.09.2015, 21:47. Показов 2929. Ответов 6
Метки нет (Все метки)
При инициализации одного объекта через другой вызывается конструктор копирования, под динамическую область памяти выделяется своя память.Вопрос такой алгоритм работы конструктора в этом случае:
1)Вызывает конструктор копирования и для динамической области выделяется своя область памяти. 2)Что же касается других данных они инициализируется значениями из кучи. Я прав?
0
|
23.09.2015, 21:47 | |
Ответы с готовыми решениями:
6
Конструктор копирования при инициализации в header файле Конструктор инициализации, конструктор копирования, деструктор Как написать конструкторы копирования, инициализации и конструктор без аргументов? Конструктор копирования, деструктор при наследовании |
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
23.09.2015, 22:06 | 2 |
Не особо понял этот поток сознания.
1) При инициализации объекта через my_class(bla-bla-bla), вызывается конструктор принимающий bla-bla-bla в качестве аргумента. В this ему подсовывается адрес памяти выделенной под объект. Откуда эта память взялась (динамическая память, стек, исчезли в соседней воинской части) - конструктор не колышет. 2) При инициализации объекта через new my_class(bla-bla-bla), вызывается operator new который рожает sizeof(my_class) свободной памяти. Как он ее родит - никого не колышет. Далее свободная память суется в this и смотри пункт 1. 3) Что означает "под динамическую область памяти выделяется своя память" я не знаю, но к вызову конструктора это никакого отношения не имеет.
0
|
-12 / 0 / 4
Регистрация: 04.10.2014
Сообщений: 272
|
|
23.09.2015, 22:13 [ТС] | 3 |
Инициализируем объект через другой - вызывается конструктор копирования, если были в классе типы данных с выделением динамической памяти, то через конструктор копирования для временного объекта выделяется своя область памяти.А если, допустим у меня классе есть статические данные,то они при инициализации заполняются значениями из кучи? То есть есть класс, в нем статические и динамические типы данных, инициалируем второй объект, через первый - вызывается конструктор копии, что с динамическим происходит данными - определено в конструкторе копии, с ними все ясно, а вот статические инициалируется значениями из кучи?понятен вопрос?
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
23.09.2015, 22:41 | 4 |
Если мы говорим о конструкторе копирования по умолчанию, то он вызывает конструктор копирования для всех полей класса. Работают они с динамической памятью или нет - ему плевать.
Если мы говорим о пользовательском конструкторе копирования, то по умолчанию он инициализирует поля с помощью конструктора по умолчанию. Если такового нет - ищет у поля конструктор с аргументами и ругается "аргументы дай". Если и конструктора с аргументами нет - плюет и оставляет в поле класса рандомный мусор, появившийся там не пойми откуда. Сам он этот мусор не вносит, это до него лежало. Те статические данные которые static, никакого отношения к копированию не имеют. Потому как существуют в единственном экземпляре, независимо от того, сколько экземпляров класса вы наплодили.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
24.09.2015, 06:28 | 5 |
artart96, начнём с того, что, по сути, все поля класса изначально либо примитивные типы, которые копируются byte-to-byte, либо объекты, для которых вызывается конструктор копирования. То, что в классе может лежать указатель, ни на что не влияет, указатель сам по себе не означает динамически выделенный ресурс, это примитивный тип, который копируется побайтно. Он может указывать, например, на другое поле класса. Поэтому как распоряжаться с отдельными полями класса в конструкторе копирования, зависит только от программиста. Если указатель действительно указывает в кучу, вам нужно позаботиться об этом, выделив новую область памяти и скопировав туда значения из соответствующей памяти, принадлежащей копируемому объекту. Только надо помнить, что если вы заменяете дефолтный конструктор копирования, который по стандарту всегда есть в любом классе, на самописный, то все поля класса вам придётся инициализировать (копировать) вручную, иначе для них будет вызван конструктор по умолчанию (а за неимением оного вообще будет ошибка компиляции).
1
|
0 / 0 / 0
Регистрация: 17.01.2017
Сообщений: 4
|
||||||
18.05.2018, 22:28 | 6 | |||||
Во-во-во, близко к моей проблеме....
В конструкторе копирования никак не хочет выделяться динам. память вылетает прога и все (
0
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
18.05.2018, 23:00 | 7 |
В конструкторе с размером внутренняя size не изменяется. Измените.
1
|
18.05.2018, 23:00 | |
18.05.2018, 23:00 | |
Помогаю со студенческими работами здесь
7
Конструктор копирования при разбиении файлов Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно? Почему не вызывается конструктор копирования при возврате объекта из функции Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |