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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
#1

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

18.02.2012, 15:41. Просмотров 1468. Ответов 12
Метки нет (Все метки)

Может быть глупый вопрос, а может я глупый...

Конструктор копирования имеет такой синтаксис

имякласса(const имякласса &){
тело конструктора
}

Почему параметр передается по ссылке?

Стал искать, нашел такую весчь:
Инициализация происходит в 3х случаях:
1) Один объект инициализирует другой
2) когда объект - параметр и передается по значению
3) когда объект возвращает функция.

Тогда я так понимаю мы просто не сможем передать параметр конструктору по значению потому, что произойдет ИНИЦИАЛИЗАЦИЯ и снова будет вызван конструктор копирования. итд.

Это правильно или не совсем, в гугле не нашел толкового объяснения в Шилдте об этом не написано
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2012, 15:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор копирования (C++):

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

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

Конструктор инициализации, конструктор копирования, деструктор - C++
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор....

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор - C++
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...

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

Конструктор копирования - C++
class alpha { public: alpha(alpha& a) { //код } }; Подскажите, почему компилятор ругается если я пытаюсь передать...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
18.02.2012, 16:08 #2
Цитата Сообщение от Merovingian Посмотреть сообщение
Почему параметр передается по ссылке?
Потому-что передавать по значению - копировать весь объект (может много весить), а тут просто принимаем ссылку (которая весит определенно меньше самого объекта) на объект. Ресурсы короче экономим + быстрее.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.02.2012, 16:10 #3
Цитата Сообщение от Merovingian Посмотреть сообщение
Тогда я так понимаю мы просто не сможем передать параметр конструктору по значению потому, что произойдет ИНИЦИАЛИЗАЦИЯ и снова будет вызван конструктор копирования. итд.
именно так

Цитата Сообщение от Merovingian Посмотреть сообщение
Конструктор копирования имеет такой синтаксис
Цитата Сообщение от Merovingian Посмотреть сообщение
имякласса(const имякласса &)
это всего лишь одна из возможных сигнатур конструктора копирования, помимо ссылки на константу допустимы
C++
1
2
3
class_name(class_name &)
class_name(volatile class_name &)
class_name(const volatile class_name &)
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
18.02.2012, 16:22 #4
См. Страуструп "Язык программирования С++. Специальное издание. 2001 г" стр 319, глава 11.3.4.
Передача по значению вызовет бесконечную рекурсию. Конструктор копирования имеет такой синтаксис.
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
18.02.2012, 17:24 #5
Цитата Сообщение от Konstantin_D Посмотреть сообщение
См. Страуструп "Язык программирования С++. Специальное издание. 2001 г" стр 319, глава 11.3.4.
Передача по значению вызовет бесконечную рекурсию. Конструктор копирования имеет такой синтаксис.
Обьясни почему будет рекурсия, если так подумать вызываем копирующий конструктор передаем по значению копируем в стек передающийся обьект, почему происходит рекурсия?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
18.02.2012, 17:30 #6
Потому что когда передается по значению то создается временный объект, в котором тоже запускается конструктор копирования, в котором опять создается временный объект и тд.
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
18.02.2012, 17:34 #7
Для передачи аргумента конструктору копирования по значению вызывается конструктор копирования и т.д.
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
18.02.2012, 21:12 #8
Цитата Сообщение от Toshkarik Посмотреть сообщение
Потому что когда передается по значению то создается временный объект, в котором тоже запускается конструктор копирования, в котором опять создается временный объект и тд.
правильно в стеке создается копия обьекта которого передаем, но я не пойму почему вызывается еще конструктор копирования там
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.02.2012, 21:15 #9
Цитата Сообщение от HardMorg Посмотреть сообщение
но я не пойму почему вызывается еще конструктор копирования там
сам же пишешь
Цитата Сообщение от HardMorg Посмотреть сообщение
в стеке создается копия обьекта которого передаем
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
18.02.2012, 22:08 #10
Цитата Сообщение от Jupiter Посмотреть сообщение
сам же пишешь
аааа та да))) понял... получается что вызываем конструктор копирования, получается тот в свою очередь копирует и тд ..
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
18.02.2012, 22:19 #11
Цитата Сообщение от HardMorg Посмотреть сообщение
копирует
Не, не успевает. Мы даже в тело КК не попадём, он будет постоянной вызываться в своём же параметре.
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
19.02.2012, 00:24 #12
Цитата Сообщение от silent_1991 Посмотреть сообщение
Не, не успевает. Мы даже в тело КК не попадём, он будет постоянной вызываться в своём же параметре.
а можете как то изобразить или что то в этом роде, я то понял но не понял
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.02.2012, 00:42 #13
когда в функцию передается аргумент по значению, а не по ссылке, он копируется.
чтобы аргумент скопировался, для него должен позваться конструктор копирования.
если конструктор копирования будет принимать аргумент не по ссылке а по значению, компилятор должен будет сгенерить код, который должен скопировать этот аргумент с помощью того же конструктора копирования. чтобы вызвался конструктор копирования, аргумент в него должен скопироваться с помощью конструктора копирования. чтобы этот второй конструктор копирования вызвался, в него нужно скопировать аргумент с помощью конструктора копирования ну и так. далее.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2012, 00:42
Привет! Вот еще темы с ответами:

Конструктор копирования - C++
Здравствуйте) объясните пожалуйста в чём проблема при описании в классе конструктора копирования компилятор выдаёт ошибку:error C3699:...

Конструктор копирования - C++
#include <iostream> using namespace std; class test { public: int x; test(int num); test(const...

Конструктор копирования - C++
Добрый вечер. Начал изучать перегрузку операций и конструктор копирования. Лазил в инете и налепил такой код. Только вот не могу понять как...

Конструктор копирования - C++
Всем привет. У меня такая проблема: есть некий класс, допустим Test: class Test { protected: int value; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.02.2012, 00:42
Ответ Создать тему
Опции темы

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