2011-09-14 28 views
42

Una pregunta bastante teórica ... ¿Por qué las referencias constantes no se comportan del mismo modo que los punteros constantes y puedo cambiar el objeto al que apuntan? Realmente parecen ser otra declaración simple de variables. ¿Por qué los usaría alguna vez? Este es un ejemplo corto que corro que compila y se ejecuta sin errores:¿Qué es una referencia constante? (no una referencia a una constante)

int main(){ 
    int i=0; 
    int y=1;  
    int&const icr=i; 
    icr=y;   // Can change the object it is pointing to so it's not like a const pointer... 
    icr=99;   // Can assign another value but the value is not assigned to y... 
    int x=9; 
    icr=x; 
    cout<<"icr: "<<icr<<", y:"<<y<<endl; 
} 
+4

Look en 'I' antes y después de 'icr = y;'. –

+3

Una referencia constante es ... tontería. :) – jalf

+2

¿Eso incluso compila? –

Respuesta

53

La respuesta más clara. Does “X& const x” make any sense?

No, it is nonsense

To find out what the above declaration means, read it right-to-left: “x is a const reference to a X”. But that is redundant — references are always const, in the sense that you can never reseat a reference to make it refer to a different object. Never. With or without the const.

In other words, “X& const x” is functionally equivalent to “X& x”. Since you’re gaining nothing by adding the const after the &, you shouldn’t add it: it will confuse people — the const will make some people think that the X is const, as if you had said “const X& x”.

43

La declaración icr=y; no hace que la referencia se refieren a y; asigna el valor de y a la variable a la que se refiere icr, i.

Las referencias son inherentemente const, es decir que no puede cambiar a lo que se refieren. Hay 'const referencias' que son realmente 'referencias a const', es decir que no puede cambiar el valor del objeto al que se refieren. Se declaran const int& o int const& en lugar de int& const.

+0

Entonces, ¿una referencia a un const también se puede ver como una referencia constante a un const? Eso tiene mucho sentido ahora. – Dasaru

+1

@Dasaru: Sí, puede, pero una referencia a no const también se puede ver como una referencia constante a no const, ya que la referencia en sí misma siempre es const, independientemente de si hace referencia a const o no. – Kaiserludi

23

Qué es una referencia constante (no una referencia a una constante)
Un referencia constante es en realidad una referencia a una constante .

una referencia constante/Referencia a una constante se denota por:

int const &i = j; //or Alternatively 
const int &i = j; 
i = 1;   //Compilation Error 

Básicamente significa, no se puede modificar el valor del objeto de tipo al que se refiere la referencia.
Por ejemplo:
Tratando de modificar el valor (asignar 1) de la variable j través de la referencia const, i voluntad resultados en error:

assignment of read-only reference ‘i’


icr=y;   // Can change the object it is pointing to so it's not like a const pointer... 
icr=99; 

no cambia la referencia, asigna el valor del tipo al que hace referencia la referencia. No se pueden hacer referencias para referir cualquier otra variable a la que están vinculadas en Inicialización.

Primera declaración cesionarios el valor y a i
segunda declaración cesionarios el valor 99 a i

+0

¿Por qué y cómo la declaración como const int & a=3; válida? – Destructor

+3

Espera, 'const Type &' es equivalente a 'Type const &'? – Tyler

+0

@Tyler, sí, es –

3

Por "referencia constante" que supongo que realmente significa "constante referencia a los datos". Los punteros, por otro lado, pueden ser un puntero constante (el puntero en sí mismo es constante, no los datos a los que apunta), un puntero a datos constantes, o ambos.

+0

El código de ejemplo en realidad se refiere a una referencia constante ('int & const icr = i;') que no es una referencia a una constante. – Void

+0

Supuse que el póster no estaba claro debido a dónde se colocó la const en el código. – Poodlehat

Cuestiones relacionadas