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

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

Войти
Регистрация
Восстановить пароль
 
stzer
92 / 68 / 20
Регистрация: 26.10.2013
Сообщений: 204
Завершенные тесты: 2
#1

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

21.07.2014, 11:43. Просмотров 374. Ответов 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++
Вопрос такой, Зачем нужна ссылка в конструкторе копирования? Почему не передавать напр. по указателю?

Как проинициализировать структурную переменную в конструкторе класса? - C++
К примеру у меня есть переменная p типа POINT. Такую запись он считает нелегальной: private: POINT p; public: MyClass()...

Напишите функцию, которая решает линейное уравнение ax+b=0 и записывает результат в переменную, передаваемую по ссылке. - C++
Напишите функцию, которая решает линейное уравнение ax+b=0 и записывает результат в переменную, передаваемую по ссылке. В случае нахождения...

Необходимо, чтобы в каждой строчке файла программа копировала в какую нибудь переменную часть структуры, чей личный код например равен 6 - C++
Стоит следующая задача: Имеется файл с текстом структуированным, (то есть к примеру через запятую ФИО телефон личный код и т.д.)...

Необходимо определить, какой будет максимальная скорость мяча в течении t сек с точностью до 0.1сек - C++
Добрый вечер. Что-то никак не могу разобраться. Пожалуйста, помогите выполнить лабу по программированию. Условие звучит так: Баскетболист...

Посчитать сумму платежей с указанной целью - C++
Проблема такая, нужно посчитать сумму платежей с указанной целью. То есть допустим я в поле "введите цель платежа" ввожу "перевод" к...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 11:50     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Что бы избежать зацикливания. Предположим вы хотите создать некую переменную var1 копию уже существующей переменной var2. Для этого будет вызван конструктор копирования, но при передаче переменной var2 в конструктор потребуется построить временный обект того же типа (ведь переменная передается по значению!). Но что бы построить это временную переменную опять вызовется конструктор копий в который опять передаваться переменная будет по значению и опять этот конструктор вызовет конструктор копий. И так бесконечно.
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
21.07.2014, 11:52     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #4
Цитата Сообщение от stzer Посмотреть сообщение
По сути же мы берем, например, obj1(уже инициализированный) и хотим чтобы obj2 был полной копией obj1(их соответствующие поля должны быть одинаковы).
допустим есть obj1 в котором мы создаем указатель на массив int a*=new int[5]; и заполняем его.
Если мы копируем по значению в obj2, то obj2.a будет указывать на тот же самый массив, что и obj1.a что есть ошибка.
stzer
92 / 68 / 20
Регистрация: 26.10.2013
Сообщений: 204
Завершенные тесты: 2
21.07.2014, 11:56  [ТС]     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #5
Ilot, спасибо.
Наверное, я когда читал эту тему что то не так понял.
Скажите, если в коде встретится такое
C++
1
ClassName obj2=obj1;
Какой именно объект подается в конструктор копирования?
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 11:58     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #6
Цитата Сообщение от stzer Посмотреть сообщение
Какой именно объект подается в конструктор копирования?
obj1
stzer
92 / 68 / 20
Регистрация: 26.10.2013
Сообщений: 204
Завершенные тесты: 2
21.07.2014, 12:00  [ТС]     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #7
Ilot, Не могли бы подсказать книгу, где об этом хорошо написано?
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 12:04     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #8
Цитата Сообщение от stzer Посмотреть сообщение
Ilot, Не могли бы подсказать книгу, где об этом хорошо написано?
Затрудняюсь сказать. В свое время мне этот момент прояснил ForEveR.
А так это должно быть в любой нормальной книге уровня Лафоре или Прата.
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
21.07.2014, 12:19     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования? #9
У Прата есть 100%
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2014, 12:32     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования?
Еще ссылки по теме:

Модифицируйте эмулятор с целью моделирования случайных сбоев ОЗУ - C++
Эмулятор IA-32 Bochs осуществляет запись данных в память с помощью функции BX_MEM_C::writePhysicalPage, которая реализована в...

Целью работы является создание программы для обработки набора объектов с использованием класса -контейнера - C++
Целью работы является создание програмки для обработки набора объектов с использованием класса -контейнера динамический массив ( vector...

ZeroMemory в конструкторе b __vfptr - C++
Есть два базовый и производный классы с виртуальными методами. В конструкторах хочу обнулить все поля, но если я делаю ZeroMemory(this...

выделение памяти в конструкторе - 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     С какой целью необходимо передвать по ссылке переменную в конструкторе копирования?
Ответ Создать тему
Опции темы

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