c++ - retorno - tipos de funciones en c
¿Por qué debería el constructor de copia aceptar su parámetro por referencia en C++? (9)
¿Por qué un constructor de copia debe pasar su parámetro por referencia?
El constructor de copias es un tipo especial de constructor que crea un nuevo objeto que es una copia de uno existente y lo hace de manera eficiente.
Cuando llame al constructor de copia sin referencia, sería un constructor de llamada recursivo hasta el acceso sin memoria.
por favor, lea para comprender claramente el constructor de copias.
https://www.codeproject.com/Tips/78946/C-Copy-Constructor-in-depth
Es muy esencial pasar objetos como referencia. Si un objeto se pasa como valor al Copy Constructor, entonces su constructor de copia se llamaría a sí mismo, para copiar el parámetro real al parámetro formal. Por lo tanto, se iniciará una cadena interminable de llamadas al constructor de copias. Este proceso continuará hasta que el sistema se quede sin memoria.
Por lo tanto, en un constructor de copia, el parámetro siempre se debe pasar como referencia.
Es necesario pasar el objeto como referencia y no por valor porque si lo pasa por valor, su copia se construye utilizando el constructor de copia. Esto significa que el constructor de copia se llamará a sí mismo para hacer una copia. Este proceso continuará hasta que el compilador se agote de la memoria
La alternativa a pasar por referencia es pasar por valor. Pass-by-value es realmente pass-by-copy. El constructor de copia es necesario para hacer una copia.
Si tuviera que hacer una copia solo para llamar al constructor de copia, sería un enigma.
(Creo que la recursión infinita ocurriría en el compilador y nunca obtendrías ese programa.)
Además de razones racionales , está prohibido por el estándar en §12.8 / 3:
Una declaración de un constructor para una clase X está mal formada si su primer parámetro es de tipo (opcionalmente cv-calificado) X y si no hay otros parámetros o todos los demás parámetros tienen argumentos predeterminados.
Porque pass-by-value invocaría al constructor de copia :)
Porque si no es por referencia, es por valor. Para hacer eso, usted hace una copia, y para hacerlo llama al constructor de copias. Pero para hacer eso, necesitamos hacer un nuevo valor, por lo que llamamos al constructor de copia, y así sucesivamente ...
(Tendría recursión infinita porque "para hacer una copia, necesita hacer una copia").
Sería infinitamente recursivo si lo pasó por valor
Si no se pasa por referencia, pasará por valor. Si el argumento se pasa por valor, su constructor de copia se llamaría a sí mismo para copiar el parámetro real a parámetro formal. Este proceso continuará hasta que el sistema se quede sin memoria. Entonces, debemos pasarlo por referencia, para que el constructor de copia no sea invocado.
cada vez que llamas a una función (ejemplo: int f (car c)) que toma sus argumentos distintos de los tipos de datos incorporados (aquí auto) un requisito para copiar el objeto real suministrado por el llamante a la variable en el parámetro de la función llamada.
ejemplo: car carobj; f (carobj);
es decir, copia carobj a c.
carobj necesita ser enfrentado al parámetro c en la función f.
Para lograr la copia, se llama al constructor de copias.
En este caso, la función f se llama usar pasar por valor o, en otras palabras, la función f se declara para pasar por valor.
Si la función f pasa por referencia, su declaración es int f (car & c);
En este caso, Car carobj; f (carobj); no necesita un constructor de copia.
En este caso, c se convierte en alias de carobj.
Usando los 2 escenarios anteriores, para su claridad los estoy resumiendo como sigue: 1. Si una función declarada toma un parámetro como valor de un objeto, entonces se llama al constructor de copia del objeto. 2. Si una función declarada toma un parámetro como pase por referencia, el parámetro se convierte en alias del objeto suministrado por la persona que llama. No hay necesidad de copiar el constructor!
Ahora la pregunta es por qué se requiere pasar por referencia. Si el constructor de copia acepta la referencia, la variable de recepción se convierte en alias del objeto suministrado. Por lo tanto, no es necesario que el constructor de copia (en este caso, llamar a sí mismo) copie el valor en el objeto suministrado por la persona que llama para copiar la variable del constructor en la lista de argumentos.
De lo contrario, si el constructor de copia toma el objeto suministrado por el llamante como valor, es decir, pasa por valor, entonces necesita el constructor de copia del objeto dado; Por lo tanto, para obtener el objeto suministrado de la persona que llama a nuestra función (en este caso, copiar el constructor) necesitamos llamar al constructor de copia, que no es más que llamar a la misma función durante la inicialización del parámetro de función. Esta es la razón de pasar una referencia al constructor de copia.