Заблокирован
|
||||||
1 | ||||||
Что такое конструктор копий?02.10.2012, 00:13. Показов 9755. Ответов 22
Метки нет (Все метки)
Объясните, пожалуйста, на максимально простом языке, чем отличается конструктор от конструктора копий?
Может это и одно и то же, хотя вряд ли, в книжке в разных разделах инфа выложена... под конструктором я понимаю что-то вроде:
А что такое конструктор копий? Злость берет, что нифига не понимаю.... Единственное порадовало: "Зачастую самой трудной задачей при определении конструктора копий является собственно осознание того,что он необходим"
0
|
02.10.2012, 00:13 | |
Ответы с готовыми решениями:
22
что такое конструктор? Что такое конструктор? Конструктор копий Конструктор копий |
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
|
||||||
02.10.2012, 00:21 | 2 | |||||
Конструктор копий - это чей-то гуглоперевод. Правильнее называть эту штуку - копирующий конструктор. Этот конструктор при создании элемента принимает в качестве единственного параметра объект того же типа, который и создаётся, делая копию необходимой информации из объекта-аргумента конструктора в создаваемый объект.
Кусочек кода:
2
|
Заблокирован
|
|||||||||||
02.10.2012, 00:31 [ТС] | 3 | ||||||||||
Да и вопрос, он нужен вообще? Просто в книжке мало описывается сам конструктор, но зато оч много о том, что по умолчанию ВСЕГДА, он есть....И еще правильна ли будет такая запись? Если я хочу в обе переменные нового объекта класса записать значения а.
0
|
5 / 5 / 5
Регистрация: 25.09.2012
Сообщений: 42
|
|||||||||||
02.10.2012, 00:53 | 4 | ||||||||||
тоже столкнулся с проблемой запуска конструктора копирования, изучая пример из учебника. листинг следующий:
cout << "\nkopirovanie\n"; и становится теперь совсем не понятно, запускается ли мой конструктор копирования или конструктор копирования по умолчанию если кто знает подскажите пожалуста хмм похоже все таки в данном случае конструктор копирования по умолчанию добавил сейчас объект ss4 и проинициализировал его значением ss1, после чего вывел. появилось сообщение запуска моего конструктора копирования: что добавил:
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|||||||||||
02.10.2012, 06:05 | 5 | ||||||||||
Сообщение было отмечено как решение
Решение
Читайте о конструкторе копирования и поймёте. В вашем коде он и не дожен был вызываться. Создаётся новый объект и инициализируется существующим объектом такого же типа - вот один из случаев, когда вызывается конструктор копирования. Именно при создании объекта. Другой случай, когда объект или передаётся в функцию по значению, или возвращается из функции. Тут тоже создаются копии конструктором копирования. Компилятор использует конструктор копирования, также, и для создания временных объектов, например, для хранения промежуточных результатов вычислений.
Добавлено через 50 минут В ваших примерах достаточно конструктора копирования по умолчанию, потому что он сделает то же самое, что и вы прописали делать своему конструктору копирования, а именно: поэлементное копирование полей класса. Свой конструктор копирования нужен, если, например, у вас в полях класса используются указатели. Например:
3
|
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
|
||||||
02.10.2012, 11:03 | 6 | |||||
Правильно.
Если копирующий конструктор явно не объявить в классе, то компилятор сгенерирует его автоматически. Как уже писали выше, не всегда компилятор сделает то, что нужно нам, поэтому в этих случаях копирующий конструктор объявляют явно. Однако это не единственный случай, когда бывает нужно явно объявить копирующий конструктор. Мы, например, можем захотеть запретить копирование объектов данного класса. Тогда мы объявляем копирующий конструктор в закрытой области:
Добавлено через 2 минуты Как уже писал, если в классе объявлен копирующий конструктор, то копирующего конструктора по умолчанию в нём уже нет. Короче, в классе может быть только один копирующий конструктор. В вашем коде копирующий конструктор в принципе не вызывается.
2
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
02.10.2012, 11:08 | 7 |
Есть копирующий оператор присваивания, он превращает один уже существующий объект в точную копию другого, а есть копирующий конструктор, он создаёт копию в новом объекте.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
02.10.2012, 11:14 | 8 | ||||||||||
alsav22,
John Prick,
1
|
02.10.2012, 11:44 | 9 | |||||
AndreyKazakov, объясняю на пальцах. если у тебя есть некий класс ClassX, и ты напишешь:
не знаю, упростил или запутал
1
|
Заблокирован
|
||||||
02.10.2012, 20:28 [ТС] | 12 | |||||
Больше всего путаюсь с указателями, а тут как разх с ними надо работать, вот класс создал
0
|
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
|
|
02.10.2012, 20:31 | 13 |
У вас str это указатель на строку, и поэтому в оригинальном объекте и его копии будет указывать на одну и ту же строку. И например при изменении строки в одном объекте будет меняться строка и в другом
2
|
Заблокирован
|
||||||
02.10.2012, 20:54 [ТС] | 15 | |||||
сделал с указателями на массивы инт, но у меня ни один копирующий конструктор по ходу не пашет.
Первый. Он копирует ссылку а не само значение, а второй , второй вообще ничего не копирует.....
0
|
Заблокирован
|
|
02.10.2012, 20:58 [ТС] | 17 |
Чуть начинаю догонять .... это хорошо особенно выражение понравилось "повреждение кучи"
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||
02.10.2012, 21:19 | 18 | |||||
Кстати, в вашем коде из 12 поста, вообще не работает конструктор копирования. Там не понятно, что работает, из-за того, что объект содержит указатель, на строковую лексему в статической памяти. Чтобы нормально всё работало, нужно так переписать:
1
|
Заблокирован
|
|
02.10.2012, 21:27 [ТС] | 19 |
Во, спасибо, а я все гадал как это можно сделать, оказывается просто через ; ....
0
|
5 / 5 / 5
Регистрация: 25.09.2012
Сообщений: 42
|
||||||
02.10.2012, 22:40 | 20 | |||||
спасибо, понял не сразу как все работает
а вот это стало новостью для меня, спасибо остался небольшой вопрос по листингу, который привел в 4-м посте почему же появляются ошибки, если отсутствует идентификатор "const"
0
|
02.10.2012, 22:40 | |
02.10.2012, 22:40 | |
Помогаю со студенческими работами здесь
20
Конструктор копий Что такое конструктор по умолчанию? Как инициализируются данные-члены объекта? Классы: конструктор копий Конструктор копий по умолчанию. Конструктор копий. Оператор присваивания С++ Конструктор копий. Функция, работающая с объектами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |