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

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

Войти
Регистрация
Восстановить пароль
 
stzer
96 / 72 / 21
Регистрация: 26.10.2013
Сообщений: 228
Завершенные тесты: 2
#1

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

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

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

О конструкторе копирования - C++
Доброго времени суток всем присутствующим. Интересует маленький вопрос. В 15-й строке происходит прямое обращение к полю входного объекта...

Ошибка в конструкторе копирования - C++
Здравствуйте. Есть один класс для работы с многочленами, который хранит элементы многочлена в списке. Так вот, в конструкторе копирования...

Ошибка в конструкторе копирования C++ - C++
Помогите, пожалуйста создать конструктор копирования, который будет копировать элемент и добавлять его в список. У меня получился такой...

Указатель this в конструкторе копирования - C++
Добрый всем вечер. Подскажите пожалуйста, как правильно применить в конструкторе копирования указатель this? Вот есть код. ...

Параметр в конструкторе копирования - C++
Есть класс class CMatrix{ valarray<valarray<double> > matrix; public: CMatrix(const CMatrix &M); ..... }; ...

Ошибка в конструкторе копирования класса - C++
Хотя и делал по образцу, но почему то лезет ошибка записи за пределы динамического массива, хотя и переменные копируются верно (отладчик...

9
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 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).
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 11:50 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Что бы избежать зацикливания. Предположим вы хотите создать некую переменную var1 копию уже существующей переменной var2. Для этого будет вызван конструктор копирования, но при передаче переменной var2 в конструктор потребуется построить временный обект того же типа (ведь переменная передается по значению!). Но что бы построить это временную переменную опять вызовется конструктор копий в который опять передаваться переменная будет по значению и опять этот конструктор вызовет конструктор копий. И так бесконечно.
1
dzrkot
zzzZZZ...
522 / 352 / 53
Регистрация: 11.09.2013
Сообщений: 2,022
21.07.2014, 11:52 #4
Цитата Сообщение от stzer Посмотреть сообщение
По сути же мы берем, например, obj1(уже инициализированный) и хотим чтобы obj2 был полной копией obj1(их соответствующие поля должны быть одинаковы).
допустим есть obj1 в котором мы создаем указатель на массив int a*=new int[5]; и заполняем его.
Если мы копируем по значению в obj2, то obj2.a будет указывать на тот же самый массив, что и obj1.a что есть ошибка.
0
stzer
96 / 72 / 21
Регистрация: 26.10.2013
Сообщений: 228
Завершенные тесты: 2
21.07.2014, 11:56  [ТС] #5
Ilot, спасибо.
Наверное, я когда читал эту тему что то не так понял.
Скажите, если в коде встретится такое
C++
1
ClassName obj2=obj1;
Какой именно объект подается в конструктор копирования?
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 11:58 #6
Цитата Сообщение от stzer Посмотреть сообщение
Какой именно объект подается в конструктор копирования?
obj1
0
stzer
96 / 72 / 21
Регистрация: 26.10.2013
Сообщений: 228
Завершенные тесты: 2
21.07.2014, 12:00  [ТС] #7
Ilot, Не могли бы подсказать книгу, где об этом хорошо написано?
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 12:04 #8
Цитата Сообщение от stzer Посмотреть сообщение
Ilot, Не могли бы подсказать книгу, где об этом хорошо написано?
Затрудняюсь сказать. В свое время мне этот момент прояснил ForEveR.
А так это должно быть в любой нормальной книге уровня Лафоре или Прата.
1
dzrkot
zzzZZZ...
522 / 352 / 53
Регистрация: 11.09.2013
Сообщений: 2,022
21.07.2014, 12:19 #9
У Прата есть 100%
0
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.
0
21.07.2014, 12:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2014, 12:32
Привет! Вот еще темы с ответами:

Зачем нужна ссылка в конструкторе копирования - C++
Вопрос такой, Зачем нужна ссылка в конструкторе копирования? Почему не передавать напр. по указателю?

Ссылка rvalue в конструкторе копирования и операторе присваивания - C++
Здравствуйте. Решил попробовать ссылки rvalue в классе. Привожу часть: \\BinaryArray.h class BinaryArray { protected: ...

Можно ли в конструкторе копирования поменять один параметр? - C++
Здравствуйте. Мне нужно при создании объекта через конструктор копирования поменять один параметр в конструкторе. Такое можно реализовать?

Исправить ошибку в конструкторе копирования пользовательского класса Sort - C++
Здравствуйте. Такая вот проблема. Обычный конструктор работает без ошибок и подчеркиваний: Sort::Sort() { cout << "len = "; ...


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

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

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