2010-12-14 13 views

Respuesta

22

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.

+4

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. –

+0

@Sergey: Buenos puntos que estaban muy mal redactados :) – Goz

+2

Escribí un programa de prueba simple para verificar las respuestas por mí mismo, espero que esto ayude a algunos http://codepad.org/XDqahndf – RishiD

3

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 1porqueinc toma su argumento por referencia. Si se hubiera hecho una copia al llamar a inc, el código se imprimirá 0.

3

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.

+2

"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. –

+0

¿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. –

+0

@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. –

6

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.

Cuestiones relacionadas