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

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

97 голосов | спросил Jony 21 PMpWed, 21 Apr 2010 23:12:41 +040012Wednesday 2010, 23:12:41

8 ответов


0

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

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

ответил GManNickG 21 PMpWed, 21 Apr 2010 23:14:41 +040014Wednesday 2010, 23:14:41
0

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

ответил Brian Roach 21 PMpWed, 21 Apr 2010 23:15:43 +040015Wednesday 2010, 23:15:43
0

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

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

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

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

  

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

ответил Potatoswatter 21 PMpWed, 21 Apr 2010 23:30:52 +040030Wednesday 2010, 23:30:52
0

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

ответил Romain Hippeau 21 PMpWed, 21 Apr 2010 23:16:06 +040016Wednesday 2010, 23:16:06
0

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

то есть скопируйте carobj в c.

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

Чтобы добиться копирования, вызывается конструктор копирования.

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

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

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

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

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

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

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

ответил Sriraman 13 MaramTue, 13 Mar 2012 04:20:49 +04002012-03-13T04:20:49+04:0004 2012, 04:20:49
0

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

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

ответил Dalbir Singh 29 Jpm1000000pmWed, 29 Jan 2014 14:07:23 +040014 2014, 14:07:23
0

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

ответил ishaang 10 MarpmMon, 10 Mar 2014 17:46:20 +04002014-03-10T17:46:20+04:0005 2014, 17:46:20
0

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

ответил anand tripathi 29 PM00000060000005731 2015, 18:42:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132