Зачем нужно, чтобы конструктор копирования передавал свой параметр по ссылке?
Почему конструктор копирования принимает свой параметр по ссылке в С++?
Ответ 1
Потому что, если он не по ссылке, он по значению. Для этого вы создаете копию, и для этого вы вызываете конструктор копирования. Но для этого нам нужно создать новое значение, поэтому мы вызываем конструктор копирования и т.д....
(У вас будет бесконечная рекурсия, потому что "чтобы сделать копию, вам нужно сделать копию".)
Ответ 2
Поскольку pass-by-value будет ссылаться на конструктор копирования:)
Ответ 3
Альтернативой отправке по ссылке является пропускная способность. Передача по значению действительно передается по копиям. Для создания копии необходим конструктор копирования.
Если вам нужно было сделать копию, чтобы вызвать конструктор копирования, это будет загадкой.
(Я думаю, что бесконечная рекурсия произойдет в компиляторе, и вы никогда не получите такую программу.)
Помимо рациональных причин, это запрещено стандартом в § 12.8/3:
Объявление конструктора для класс X плохо сформирован, если его первый параметр имеет тип (необязательно cv- квалифицированный) X и либо нет другие параметры или все остальные параметры имеют аргументы по умолчанию.
Ответ 4
Это было бы бесконечно рекурсивным, если бы вы передали его значением
Ответ 5
всякий раз, когда вы вызываете функцию (пример: int f (car c))
который принимает свои аргументы, отличные от встроенных типов данных (здесь автомобиль)
требование скопировать фактический объект, предоставленный вызывающим абонентом
к переменной в параметре вызываемой функции.
пример: carobj; F (carobj);
то есть скопировать carobj в c.
carobj необходимо выполнить с параметром c в функции f.
Чтобы добиться копирования, вызывается конструктор копирования.
В этом случае функция f, называемая с использованием pass by value или другими словами, объявляет, что функция f принимает значение pass по значению.
Если функция f принимает по ссылке, то ее объявление является int f (car & c);
В этом случае автомобиль carobj; F (carobj); не требуется конструктор копирования.
В этом случае c станет псевдонимом carobj.
Используя вышеприведенные 2 сценария, для вашей ясности я суммирую их как: 1. Если функция объявлена для принятия параметра как значения объекта, вызывается экземпляр конструктора объекта. 2. Если объявленная функция принимает параметр как передаваемый по ссылке, параметр становится псевдонимом объекта, предоставленного вызывающим. Нет необходимости в конструкторе копирования!
Теперь возникает вопрос, почему требуется пройти по ссылке. Если конструктор копирования принимает ссылку, принимающая переменная становится псевдонимом поставляемого объекта. Следовательно, нет необходимости в конструкторе копирования (в данном случае, призывать к себе), чтобы скопировать значение в объекте, предоставленном вызывающим, для копирования переменной конструктора в список аргументов.
В противном случае, если конструктор копирования принимает объект, предоставленный вызывающим объектом, как значение, т.е. передает по значению, тогда ему нужен экземпляр копии данного объекта; Следовательно, чтобы получить предоставленный объект от вызывающего в нашу функцию (в данном случае конструктор копирования), нам нужно вызвать конструктор копирования, который является не чем иным, как вызовом той же самой функции во время инициализации самого параметра функции. Это является причиной передачи ссылки на конструктор копирования.
Ответ 6
Очень важно передавать объекты в качестве ссылки. Если объект передается как значение в Copy Constructor, то его конструктор копирования сам вызовет, чтобы скопировать фактический параметр в формальный параметр. Таким образом, будет инициирована бесконечная цепочка вызова конструктора копирования. Этот процесс будет продолжаться до тех пор, пока система не исчерпает память.
Следовательно, в конструкторе копирования параметр всегда должен передаваться как ссылка.
Ответ 7
Если он не передан по ссылке, он будет передаваться по значению. Если аргумент передается по значению, его конструктор копирует вызов для копирования фактического параметра в формальный параметр. Этот процесс будет продолжаться до тех пор, пока система не исчерпает память. Итак, мы должны передать его по ссылке, чтобы конструктор копирования не вызывался.
Ответ 8
Даже если это не разрешено, не кажется ли это логичным, то есть здесь нет бесконечной рекурсии.
class abc
{
int a; char b;
public:
abc()
{a=0;b='g';}
abc(abc obj) //obj will use default constructor so it should work perfectly right?
{
a=obj.a;
b=obj.b;
}
};
так может кто-нибудь объяснить..?
Ответ 9
Необходимо передать объект как ссылку, а не по значению, потому что если вы передаете его по значению, его копия будет построена с использованием конструктора копирования. Это означает, что конструктор копирования будет называть себя, чтобы сделать копию. Этот процесс будет продолжаться до тех пор, пока У компилятора заканчивается память.