¿Deserentando un puntero y pasándolo a una función que toma su argumento por referencia, crea una copia del objeto?¿Deserentando un puntero se hace una copia?
Respuesta
En este caso, se copia el valor en el puntero (aunque este no es necesariamente el caso ya que el optimizador puede optimizarlo).
int val = *pPtr;
En este caso, sin embargo ninguna copia tendrán lugar:
int& rVal = *pPtr;
La razón ninguna copia se lleva a cabo se debe a una referencia no es un constructo nivel de código máquina. Es una construcción de nivel superior y, por lo tanto, es algo que el compilador usa internamente en lugar de generar código específico para ella.
Lo mismo, obviamente, va para los parámetros de la función.
No es el puntero que se copia en el primer caso. Es el valor que apunta que se copia. En el segundo caso, el puntero se copia (lógicamente) y el valor no. –
@Sergey: Buenos puntos que estaban muy mal redactados :) – Goz
Escribí un programa de prueba simple para verificar las respuestas por mí mismo, espero que esto ayude a algunos http://codepad.org/XDqahndf – RishiD
Esperemos que no: lo haría si la función llamada toma su argumento por valor.
Por otra parte, ese es el comportamiento esperado de referencia: Se espera que
void inc(int &i) { ++i; }
int main()
{
int i = 0;
int *j = &i;
inc(*j);
std::cout << i << std::endl;
}
este código para imprimir 1
porqueinc
toma su argumento por referencia. Si se hubiera hecho una copia al llamar a inc
, el código se imprimirá 0
.
No. Una referencia es más o menos como un puntero con notación diferente y la restricción de que no hay referencia nula. Pero como un puntero, contiene solo la dirección de un objeto.
"Pero, como un puntero, contiene solo la dirección de un objeto". La referencia no tiene existencia propia. Es solo un alias del objeto al que se inicializó. Por lo tanto, decir que "contiene" dirección será incorrecta. La referencia solo apunta a la misma dirección que el objeto original, no contiene esa dirección. –
¿Por qué no? ¿Cómo puede apuntar a algún lado y no contener la dirección? Sí lo contiene, solo que no puede acceder a la dirección que contiene porque se desreferencia automáticamente cada vez que accede a él. –
@Sergey Tachenov: el compilador tiene que crear la ficción de que es un alias y puede asumirlo. Esto significa que, dependiendo del uso, el compilador puede crear un puntero * interno * y desreferenciarlo automáticamente al usarlo, o en algunos casos puede referirse al objeto original por completo. En la mayoría de los casos, tiene que recurrir a los indicadores, pero al final del día, es mejor que piense en términos abstractos: las referencias son * alias * independientemente de cómo se implementen. –
En el caso simple, no. Hay casos más complicados, sin embargo:
void foo(float const& arg);
int * p = new int(7);
foo(*p);
En este caso, se crea un objeto temporal, porque el tipo del puntero sin referencia (int
) no coincide con el tipo base del parámetro de función (float
). Existe una secuencia de conversión, y el temporal convertido se puede vincular a arg
ya que es una referencia constante.
- 1. ¿Cómo se hace una copia de un objeto?
- 2. ¿Hace Enumerable.Repeat() una copia profunda?
- 3. Copia de clase C++ (copia de puntero)
- 4. copia de un puntero de cadena
- 5. ¿Libpcap siempre hace una copia del paquete?
- 6. clone(): ArrayList.clone() pensé hace una copia superficial
- 7. ¿Qué hace la copia hg?
- 8. Parámetros de función: ¿Copia o puntero?
- 9. Escribir una copia profunda - copiando el valor del puntero
- 10. ¿cómo se copia un CALayer?
- 11. ¿Cómo se hace una copia profunda de un objeto en Java?
- 12. Buffer.BlockCopy contra byte inseguro * copia del puntero
- 13. C++: Copia profunda de un puntero de clase base
- 14. NSString copia no copia?
- 15. Asignación hace puntero desde entero sin conversión
- 16. En C# hace Array.ToArray() realizar una copia DEEP?
- 17. ¿Por qué un puntero a un puntero es incompatible con un puntero a una matriz?
- 18. ¿Cómo se hace una imagen para seguir el puntero del mouse con jquery?
- 19. ¿Cómo se hace un impulso heterogéneo :: mapa?
- 20. puntero a un puntero
- 21. Cómo crear una copia de uiview (no un puntero a la vista original)
- 22. ¿Cuándo se copia un valor/objeto C# y cuándo se copia su referencia?
- 23. ¿Cambiar un puntero se considera una acción atómica en C?
- 24. ¿Cómo se puede implementar un puntero excepto almacenar una dirección?
- 25. ¿Cómo hace una copia de seguridad y restaura una base de datos como copia en el mismo servidor?
- 26. constructor de copia: copia completa una clase abstracta
- 27. C: Haciendo una copia profunda de una estructura ... haciendo una copia superficial de una estructura
- 28. ¿A qué se inicializa un puntero?
- 29. C++ borrar un puntero a un puntero
- 30. Inyectando texto cuando se copia contenido de una página web
Re: el título. Si la desreferenciación de un puntero hiciera una copia del objeto, ¿no sería imposible usar el objeto alguna vez? – visitor