2011-08-24 12 views
20

Tengo un par de preguntas relacionadas con el uso de referencias en C++.¿Por qué puedo asignar un nuevo valor a una referencia, y cómo puedo hacer una referencia referirme a algo más?

  1. En el código que se muestra a continuación, cómo funciona y no da un error en la línea q = "world";?

    #include <iostream> 
    
    using namespace std; 
    
    int main() 
    { 
        char *p = "Hello"; 
        char* &q = p; 
        cout <<p <<' '<<q <<"\n"; 
        q = "World"; //Why is there no error on this line 
        cout <<p <<' '<<q <<"\n"; 
    } 
    
    1. ¿Cómo puede un q referencia asignado el valor de otra cosa?

    2. ¿No es la cadena literal, p = "Hello", un espacio constante o de solo lectura? Así que si lo hacemos,

      q = "World"; 
      

      no habría la cuerda en p que se supone que es constante puede cambiar?

  2. He leído las variables de tipo de referencia acerca de C++, ya que no se puede reinicializar o reasignados, ya que se almacenan 'internamente' como punteros constantes. Entonces un compilador daría un error.

    Pero, ¿cómo se puede reasignar una variable de referencia?

    int i; 
    
    int &j = i; 
    
    int k; 
    
    j = k; //This should be fine, but how we reassign to something else to make compiler flag an error? 
    

    Estoy tratando de hacerse con esta referencia, y en el que tal vez echaba de menos algunas cosas claves relacionadas, por lo que estas preguntas.

Por lo tanto, cualquier puntero para aclarar esto, sería útil.

Respuesta

41
    • a) No puede, la línea que usted cita no cambia la referencia q, cambia p.
    • b) No el literal es constante, pero p es un puntero que apunta a un literal. El puntero puede cambiarse, lo que se señala no puede. q = "world"; hace que el puntero p señale algo más.
  1. usted parece pensar que este código

    int i; 
    int &j = i; 
    int k; 
    j = k; 
    

    se Reasignación de una referencia, pero no lo es. Está asignando el valor de k a i, j todavía se refiere a i. Supongo que este es su mayor malentendido.

+0

Precisamente, mi qns era y es qué código reasignaría una referencia a otra cosa. (Lo que técnicamente no está permitido) mencioné en OP que j = k; está bien porque sabía que cambia el valor del 'árbitro'. – goldenmean

+7

No hay un código legal que reasigne una referencia. – john

19

Un detalle importante sobre las referencias que creo que se está perdiendo es que una vez que la referencia está vinculada a un objeto, nunca podrá reasignarla. Desde ese momento en adelante, cada vez que use la referencia, es indistinguible de usar el objeto al que se refiere. A modo de ejemplo, en su primera pieza de código, cuando se escribe

q = "World"; 

Desde q es una referencia obligada a p, esto es equivalente a escribir

p = "World"; 

Lo cual cambia cuando p está señalando, no el contenido de la cuerda a la que apunta. (¡Esto también explica por qué no falla!)

En cuanto a su segunda pregunta, las referencias no se pueden reasignar una vez vinculadas a un objeto. Si necesita una referencia que pueda cambiar su referente, debe usar un puntero en su lugar.

Espero que esto ayude!

3

a) ¿Cómo se puede reiniciar una referencia q a otra cosa?

¡No puede ser!

Una variable de referencia sigue siendo un alias a la que se inicializó en el momento de la creación.


b) ¿No es la cadena literal, p = "Hola", una constante/en el espacio de sólo lectura. Entonces, si lo hacemos,
No, no es así.

char* &q = p; 

Aquí q es una referencia a puntero del tipo char p. La cadena aquí es constante, el puntero no, se puede apuntar a otra cadena, y la referencia es un alias de este puntero, no el literal de cadena, por lo que es válido.


c) Segunda pregunta que tengo es que he leído sobre C++ las variables de tipo referencia, ya que no se puede reinicializar/reasignado, ya que se almacenan 'internamente' como punteros constantes. Entonces un compilador daría un error.

int i; 

int &j = i; 

int k; 

j = k; //This should be fine, but how we reassign to something else to make compiler flag an error 

no reasigna la referencia. cambia el valor de la variable a la que era alias.

En este caso se cambia el valor de i a k

3

Tratar referencia como un nombre de alias y espero que el mundo de referencia sea mucho más fácil de entender.

int p; // Declares p as an integer; Defines p & allocates space 
int &q = p ; // Declares a Reference. Though they are symbolically 2 variables, 
      // they essentially refer to same name and same memory location. 

Entonces, p = 5 yq = 5 serán todos iguales.

En su ejemplo,

char *p = "Hello"; // Declares your pointer to "Hello". p has its own existence. 
char* &q = p; // This now creates a reference (alias) to p with name q. 

Así que en general, p & q son nombres de la entidad/objeto (memoria).

Entonces, si asigna q algo, también se refleja en p. Porque es lo mismo que la asignación a p. Entonces q = "Mundo", significa que p también apunta a "Mundo". es decirla ubicación de la Memoria que p p. & q ambos refieren a - contiene la dirección del primer caracter de "Mundo".

Espero que la segunda pregunta no necesite respuesta si entiende la noción de referencia como un alias.

Cuestiones relacionadas