Почему конструктор копирования должен принимать свой параметр по ссылке в C++?
Почему конструктор копирования должен передавать свой параметр по ссылке?
8 ответов
потому что если это не по ссылке, то по значению. Для этого вы делаете копию, и для этого вы вызываете конструктор копирования. Но для этого нам нужно сделать новое значение, поэтому мы вызываем конструктор копирования, и так далее...
(У вас будет бесконечная рекурсия, потому что "чтобы сделать копию, вам нужно сделать копию".)
альтернативой pass-by-reference является pass-by-value. Pass-by-value-это действительно pass-by-copy. Конструктор copy необходим для создания копии.
Если бы вам пришлось сделать копию только для вызова конструктора копирования, это была бы головоломка.
(Я думаю, что бесконечная рекурсия будет происходить в компиляторе и вы никогда не получите такую программу.)
кроме того рациональный причинам, это запрещено стандартом в §12.8/3:
объявление конструктора для класс X плохо сформирован, если его первый параметр имеет тип (необязательно cv- квалифицированный) X и либо нет другие параметры или все другое параметры имеют аргументы по умолчанию.
всякий раз, когда вы вызываете функцию (пример: int f (car c))
который принимает свои аргументы, отличные от встроенных типов данных (здесь car)
требование копировать фактический объект, предоставленный вызывающим объектом
к переменной в параметре вызываемой функции.
пример: car carobj; f (carobj);
то есть скопируйте carobj в c.
carobj нужно справиться с параметром c в функции f.
для достижения копирования вызывается конструктор копирования.
в этом случае, функция f, вызываемая с помощью pass by value или, другими словами, функция f объявляется как pass by value.
Если функция f проходит по ссылке, то ее объявление int f (car &c);
в этом случае car carobj; f (carobj); не нуждается в конструкторе копирования.
в этом случае c становится псевдонимом carobj.
используя вышеуказанные 2 сценария, для вашей ясности я суммирую их как: 1. Если функция объявлена принимают параметр, как стоимость объект, затем вызывается конструктор копирования объекта. 2. Если функция, объявленная для принятия параметра в качестве передачи по ссылке, параметр становится псевдонимом объекта, предоставленного вызывающим. Нет необходимости копировать конструктор!
теперь вопрос в том, почему требуется пройти по ссылке. Если конструктор копирования принимает ссылку, получающая переменная становится псевдонимами поставляемого объекта. Следовательно, нет необходимости копировать конструктор (в данном случае вызов к себе), чтобы скопировать значение в объект, поставляемый вызывающим переменная конструктора в списке аргументов.
в противном случае, если конструктор копирования принимает абонента предоставленного объекта как ценность, т. е. передаче по значению, то нужен конструктор копирования данного объекта; следовательно, чтобы получить указанный объект от абонента в нашу функцию (в данном случае конструктор копирования), мы должны вызвать конструктор копирования, который ничего, кроме вызова той же функции в функцию параметра инициализации само себя. Это причина передачи ссылки на copy конструктор.
очень важно передавать объекты в качестве ссылки. Если объект передается как значение конструктору копирования, то его конструктор копирования вызовет себя, чтобы скопировать фактический параметр в формальный параметр. Таким образом, будет инициирована бесконечная цепочка вызовов конструктора копирования. Этот процесс будет продолжаться до тех пор, пока в системе не закончится память.
следовательно, в конструкторе копирования параметр всегда должен передаваться как ссылка.
Если его не передается по ссылке, то он будет проходить по значению. Если аргумент передается по значению, его конструктор копирования будет называть себя копирование фактического параметра в формальный параметр. Этот процесс будет продолжаться до тех пор, пока в системе не закончится память. Итак, мы должны передать его по ссылке, чтобы конструктор копирования не вызывался.
необходимо передать объект как ссылку, а не по значению, потому что если вы передадите его по значению, его копия будет построена с помощью конструктора копирования.Это означает, что конструктор копирования будет вызывать себя для создания копии.Этот процесс будет продолжаться до тех пор, пока у компилятора не закончится память.