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

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

Войти
Регистрация
Восстановить пароль
 
stzer
40 / 61 / 17
Регистрация: 26.10.2013
Сообщений: 185
Завершенные тесты: 2
#1

С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? - C++

21.07.2014, 11:43. Просмотров 363. Ответов 9
Метки нет (Все метки)

Почему аргумент в конструктор копирования передается не по значению, а по ссылке? Объясните понятным языком, пожалуйста.
C++
1
ClassName(const ClassName&)
По сути же мы берем, например, obj1(уже инициализированный) и хотим чтобы obj2 был полной копией obj1(их соответствующие поля должны быть одинаковы).
Но зачем тут фигурирует ссылка? Мы же просто можем переписать значения полей.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2014, 11:43     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования?
Посмотрите здесь:

C++ Передать переменную типа char по ссылке
C++ Зачем нужна ссылка в конструкторе копирования
C++ Параметр в конструкторе копирования
C++ Ошибка в конструкторе копирования класса
Ошибка в конструкторе копирования C++
C++ О конструкторе копирования
C++ В конструкторе копирования отцовского (_str) класса возникает некое "необработанное исключение"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
21.07.2014, 11:48     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #2
stzer, Гм. При передаче по значению вызовется конструктор копирования (не учитываем всякие оптимизации, С++11), более того так положено по стандарту.

A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&,
volatile X& or const volatile X&, and either there are no other parameters or else all other parameters
have default arguments (8.3.6).
Ilot
Модератор
Эксперт С++
1784 / 1159 / 224
Регистрация: 16.05.2013
Сообщений: 3,048
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 11:50     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Что бы избежать зацикливания. Предположим вы хотите создать некую переменную var1 копию уже существующей переменной var2. Для этого будет вызван конструктор копирования, но при передаче переменной var2 в конструктор потребуется построить временный обект того же типа (ведь переменная передается по значению!). Но что бы построить это временную переменную опять вызовется конструктор копий в который опять передаваться переменная будет по значению и опять этот конструктор вызовет конструктор копий. И так бесконечно.
dzrkot
zzzZZZ...
518 / 348 / 53
Регистрация: 11.09.2013
Сообщений: 1,994
21.07.2014, 11:52     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #4
Цитата Сообщение от stzer Посмотреть сообщение
По сути же мы берем, например, obj1(уже инициализированный) и хотим чтобы obj2 был полной копией obj1(их соответствующие поля должны быть одинаковы).
допустим есть obj1 в котором мы создаем указатель на массив int a*=new int[5]; и заполняем его.
Если мы копируем по значению в obj2, то obj2.a будет указывать на тот же самый массив, что и obj1.a что есть ошибка.
stzer
40 / 61 / 17
Регистрация: 26.10.2013
Сообщений: 185
Завершенные тесты: 2
21.07.2014, 11:56  [ТС]     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #5
Ilot, спасибо.
Наверное, я когда читал эту тему что то не так понял.
Скажите, если в коде встретится такое
C++
1
ClassName obj2=obj1;
Какой именно объект подается в конструктор копирования?
Ilot
Модератор
Эксперт С++
1784 / 1159 / 224
Регистрация: 16.05.2013
Сообщений: 3,048
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 11:58     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #6
Цитата Сообщение от stzer Посмотреть сообщение
Какой именно объект подается в конструктор копирования?
obj1
stzer
40 / 61 / 17
Регистрация: 26.10.2013
Сообщений: 185
Завершенные тесты: 2
21.07.2014, 12:00  [ТС]     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #7
Ilot, Не могли бы подсказать книгу, где об этом хорошо написано?
Ilot
Модератор
Эксперт С++
1784 / 1159 / 224
Регистрация: 16.05.2013
Сообщений: 3,048
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 12:04     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #8
Цитата Сообщение от stzer Посмотреть сообщение
Ilot, Не могли бы подсказать книгу, где об этом хорошо написано?
Затрудняюсь сказать. В свое время мне этот момент прояснил ForEveR.
А так это должно быть в любой нормальной книге уровня Лафоре или Прата.
dzrkot
zzzZZZ...
518 / 348 / 53
Регистрация: 11.09.2013
Сообщений: 1,994
21.07.2014, 12:19     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #9
У Прата есть 100%
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2014, 12:32     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования?
Еще ссылки по теме:

C++ Указатель this в конструкторе копирования
Как проинициализировать структурную переменную в конструкторе класса? C++
C++ Можно ли в конструкторе копирования поменять один параметр?
Ссылка rvalue в конструкторе копирования и операторе присваивания C++
Исправить ошибку в конструкторе копирования пользовательского класса Sort C++

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

Или воспользуйтесь поиском по форуму:
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
21.07.2014, 12:32     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #10
Цитата Сообщение от stzer Посмотреть сообщение
C++
1
ClassName obj2=obj1;
Какой именно объект подается в конструктор копирования?
инциализируеться/создается obj2 значит он и ловит то , что ему нужно в свой конструктор копирования. Так как при создании (obj2) должен вызваться конструктор obj2.
В данном случае констр копии.
Обычно конструктор копии пишут вот так
C++
1
clasname (const clasname & rhs)
rhs - right hand..т.е. то что справа. а справа у нас какраз obj1.
Yandex
Объявления
21.07.2014, 12:32     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования?
Ответ Создать тему
Опции темы

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