2011-12-26 21 views
6

Así que estoy tratando de aprender C++ y me he encontrado con algo que me desconcierta un poco. Tengo el código,Aclaración de referencias en C++

int x = 0; 
int &y = x; 
cout << &x<< " " << x << " " << &y << " " <<y<< endl; 

Este compila bien y da como resultado:

0 003AFA08 0 003AFA08 

Lo que tengo problemas para entender por qué la conversión de X, un int, a & y, una referencia, no lo hace provocar un error Al principio pensé que era algún tipo de conversión, sin embargo,

int &y = &x; 

resulta en un error.

¿Alguien puede explicar por qué esto funciona de esta manera? Gracias por adelantado.

+0

Así que desea saber por qué el operador de inserción de flujo '<<' puede escribir la dirección de una variable como una cadena hexadecimal numérica pero no puede asignar la dirección de un 'int' (con tipo' int * ') a 'int &'? – bobbymcr

+3

Supongo que es '003AFA08 0 003AFA08 0' – onemach

Respuesta

11

int& no es una dirección . Es una referencia .

int& y = x; declara y como referencia x. Significa efectivamente que y se convierte en otro nombre para x. Cada vez que use y, es como si hubiera dicho x.

Los apuntadores (no referencias) se utilizan para almacenar direcciones. int& y = &x; no es válido porque &x es la dirección de x (es un int*). y es una referencia a int, no una referencia a int*.

+1

Gracias que acaba de hacer que C++ tenga mucho más sentido ... – jozefg

+0

Estrictamente hablando,' & x' no es la * dirección de * 'x', sino un * puntero a *' x', aunque el operador '&' se llame * address-of * :) – fredoverflow

+1

@FredOverflow: "Un valor válido de un tipo de puntero de objeto representa la dirección de un byte en la memoria o un puntero nulo." Lo suficientemente cerca para mí. :) – GManNickG

5

No es una conversión. Cuando tiene un tipo de variable de T & donde T es de tipo aleatorio, básicamente está diciendo "Estoy declarando un nombre que es un alias para otro nombre o posiblemente un valor anónimo". Es más como un typedef que un puntero.

Las referencias a menudo se implementan como direcciones, pero ese no es un buen modelo para pensar sobre lo que son.

En el ejemplo que usted está confundido por:

int * const &y = &x; 

funcionaría bien. Entonces y se convierte en un alias para el resultado temporal de tomar la dirección de x. Tenga en cuenta que es una referencia a un puntero. Tiene que ser una referencia a un puntero constante porque es una referencia a un valor temporal.

1

Su problema es que &y no es simplemente una dirección, sino una referencia. Esto significa que se comporta como una copia de x. No se convierte y en realidad se está convirtiendo en otro nombre para x.

2

&y no es simplemente una dirección, es una referencia. Esto significa que

int &y = x; 

hace un clon de x con el nombre de y.