2009-10-11 12 views
28

Según MSDN: "Cuando se sigue la lista de parámetros de una función miembro, la palabra clave const especifica que la función no modifica el objeto para el que se invoca".¿Qué significa const después de una firma de función/método?

¿Alguien podría aclarar esto un poco? ¿Significa que la función no puede modificar ninguno de los miembros del objeto?

bool AnalogClockPlugin::isInitialized() const 
{ 
    return initialized; 
} 
+0

[Cuando su después de la declaración de su referencia a la clase de 'esto'] (http://stackoverflow.com/questions/10982628/non-member-function-cannot- have-cv-qualifier) ​​ –

Respuesta

33

Esto significa que el método no modificar variables miembro (a excepción de los miembros declarados como mutable), por lo que puede ser llamado en constantes instancias de la clase.

class A 
{ 
public: 
    int foo() { return 42; } 
    int bar() const { return 42; } 
}; 

void test(const A& a) 
{ 
    // Will fail 
    a.foo(); 

    // Will work 
    a.bar(); 
} 
+0

¿Podría aclarar "instancias constantes"? Tal vez con un pequeño código? – Scott

+1

Scratch that. Parece que proporcionó un código después de todo. – Scott

+1

Querrá leer sobre const-idad de C++. Necesitarás usar el constructor de const en los objetos const STL, etc. – nall

2

El compilador no permitirá que un método constante para cambiar esto o * a invocar una función miembro no constante para este objeto

2

Como respondida por @delroth significa que la función miembro doesn No modifique ninguna variable memeber excepto aquellas declaradas como mutables. Puede ver una buena pregunta frecuente acerca de la corrección const en C++ here

16

Tenga en cuenta también que, aunque la función miembro no puede modificar variables miembro no marcadas como mutables, si las variables miembro son punteros, la función miembro puede no ser capaz de modificar valor del puntero (es decir, la dirección a la que apunta el puntero), pero puede modificar a qué apunta el puntero (la región de memoria real).

Así, por ejemplo:

class C 
{ 
public: 
    void member() const 
    { 
     p = 0; // This is not allowed; you are modifying the member variable 

     // This is allowed; the member variable is still the same, but what it points to is different (and can be changed) 
     *p = 0; 
    } 

private: 
    int *p; 
}; 
+1

Buen punto. Es la diferencia entre const-pointer-to-int, pointer-to-const-int y const-pointer-to-const-int. los métodos const hacen que el puntero sea const. – UncleBens

+0

Probablemente signifique "... las variables miembro _no_ marcado como mutable ...". – sbi

+0

Vaya, jaja. Lo siento por eso. – blwy10

Cuestiones relacionadas