Почему конструктор копирования должен принимать свой параметр по ссылке в C ++? - PullRequest
101 голосов
/ 21 апреля 2010

Почему конструктору копирования нужно передать свой параметр по ссылке?

Ответы [ 8 ]

161 голосов
/ 21 апреля 2010

Потому что если это не по ссылке, это по значению. Для этого вы делаете копию, а для этого вы вызываете конструктор копирования. Но для этого нам нужно создать новое значение, поэтому мы вызываем конструктор копирования и так далее ...

(У вас будет бесконечная рекурсия, потому что «чтобы сделать копию, вам нужно сделать копию».)

62 голосов
/ 21 апреля 2010

Поскольку передача по значению вызовет конструктор копирования:)

18 голосов
/ 21 апреля 2010

Альтернативой передаче по ссылке является передача по значению. Передача по значению действительно передается по копии. Конструктор копирования необходим для создания копии.

Если бы вам пришлось сделать копию только для вызова конструктора копирования, это было бы загадкой.

(Я думаю, что бесконечная рекурсия произойдет в компиляторе, и вы никогда не получите такую ​​программу.)

Кроме рациональных причин, это запрещено стандартом в §12.8 / 3:

Объявление конструктора для класс X плохо сформирован, если его первый параметр имеет тип (необязательно cv- уточнил) Х а либо нет другие параметры или все остальное параметры имеют аргументы по умолчанию.

12 голосов
/ 21 апреля 2010

Было бы бесконечно рекурсивно, если бы вы передали его по значению

3 голосов
/ 13 марта 2012

всякий раз, когда вы вызываете функцию (пример: int f (car c)), которая принимает свои аргументы, отличные от встроенных типов данных (здесь car), требование скопировать фактический объект, предоставленный вызывающей стороной, в переменную в вызываемомпараметр функции.
пример: car carobj;f (carobj);

, то есть копировать carobj в c.

carobj необходимо скопировать в параметр c в функции f.

Для копирования необходимо создать конструктор копированияназывается.

В этом случае функция f вызывается с использованием передачи по значению или, другими словами, объявляется, что функция f принимает передачу по значению.

Если функция f принимает передачу по ссылке, то ее объявлениеint f (car & c);

В этом случае car carobj;F (carobj);не нуждается в конструкторе копирования.

В этом случае c становится псевдонимом carobj.

Используя вышеупомянутые 2 сценария, для вашей ясности я суммирую их как: 1. Если объявленная функциячтобы принять параметр в качестве значения объекта, вызывается конструктор копирования объекта.2. Если функция, объявленная для передачи параметра в качестве передачи по ссылке, параметр становится псевдонимом объекта, предоставленного вызывающей стороной.Нет необходимости в конструкторе копирования!

Теперь вопрос в том, почему требуется передача по ссылке.Если конструктор копирования принимает ссылку, получающая переменная становится псевдонимом предоставленного объекта.Следовательно, нет необходимости в конструкторе копирования (в данном случае, вызове самого себя) для копирования значения в предоставленном вызывающем объекте для копирования переменной конструктора в списке аргументов.

В противном случае, если конструктор копирования принимает предоставленный вызывающим объектом объект как значение, то есть передает значение, то ему необходим конструктор копирования данного объекта;Следовательно, чтобы получить предоставленный объект от вызывающей стороны в нашу функцию (в данном случае, конструктор копирования), нам нужно вызвать конструктор копирования, который является ничем иным, как вызовом той же функции во время самой инициализации параметра функции.Это причина передачи ссылки на конструктор копирования.

0 голосов
/ 29 августа 2015

Необходимо передать объект как ссылку, а не по значению, потому что, если вы передаете его по значению, его копия создается с помощью конструктора копирования. Это означает, что конструктор копирования будет вызывать себя для создания копии. Этот процесс будет продолжаться до тех пор, пока Компилятору не хватает памяти.

0 голосов
/ 10 марта 2014

Если он не передан по ссылке, он будет передан по значению. Если аргумент передается по значению, его конструктор копирования будет вызывать себя для копирования фактического параметра в формальный параметр. Этот процесс будет продолжаться, пока система не исчерпает память. Итак, мы должны передать его по ссылке, чтобы конструктор копирования не вызывался.

0 голосов
/ 29 января 2014

Очень важно передать объекты в качестве ссылки. Если объект передается как значение в конструктор копирования, то его конструктор копирования будет вызывать сам себя, чтобы скопировать фактический параметр в формальный параметр. Таким образом, будет инициирована бесконечная цепочка вызовов конструктора копирования. Этот процесс будет продолжаться до тех пор, пока система не исчерпает память.

Следовательно, в конструкторе копирования параметр всегда должен передаваться как ссылка.

...