2010-03-12 28 views
18

estoy trabajando en const-corrección de mi código y simplemente se preguntó por qué este código se compila:Modificación miembro de referencia del método constante en C++

class X 
{ 
    int x; 
    int& y; 
public: 
    X(int& _y):y(_y) 
    { 
    } 
void f(int& newY) const 
    { 
     //x = 3; would not work, that's fine 
     y = newY; //does compile. Why? 
    } 
}; 

int main(int argc, char **argv) 
{ 
    int i1=0, i2=0; 
    X myX(i1); 
    myX.f(i2); 
... 
} 

Por lo que yo entiendo, f() está cambiando el objeto myX, aunque dice que es const. ¿Cómo puedo asegurarme de que mi compilador se queja cuando lo asigno a y? (Visual C++ 2008)

¡Muchas gracias!

+3

Imagine que era un puntero en lugar de una referencia. Podrías ver que '* y = newY' aún puede ser const, porque el puntero en sí no se cambia, solo el puntero. Del mismo modo, la referencia no cambia (eso es imposible), a qué se refiere. – GManNickG

Respuesta

20

Porque no está cambiando ninguna variable en X. En realidad, usted está cambiando _y que es un extraño con respecto a su clase. No hay que olvidar que:

y = newY; 

está asignando el valor de newY a la variable apuntada por y, pero no las referencias de ellos mismos. Solo en la inicialización se consideran las referencias.

+8

+1, esta es la respuesta. Tenga en cuenta la equivalencia con los punteros, quizás sea más fácil entender, digamos que declara 'int * y;', entonces '* y = newY' es válido, pero' y = & newY' no lo es. – falstro

+0

gracias. Creo que lo que realmente quería era un puntero como miembro. – Philipp

+4

Por supuesto, y se podría hacer que se refiera a un miembro de la clase, y luego estaría modificando el estado de la clase. Simplemente sucede que en este ejemplo no es así. – visitor

5

La situación es similar a la de los miembros del puntero. En una función de miembro constante, la const se aplica al puntero en sí, no al puntero.

Es la diferencia entre:

X* const //this is how the const applies: you can modify the pointee 
const X* 

Excepto X& const no es una sintaxis válida, ya que no se puede hacer la referencia para hacer referencia a otro objeto, en primer lugar (que son siempre implícitamente const). En conclusión: los métodos de const no tienen ningún efecto en las referencias de los miembros.

Cuestiones relacionadas