Considera una variación de tu clase A
.
class A {
public:
void Foo() const;
void Moo();
private:
int m_nState; // Could add mutable keyword if desired
int GetState() const { return m_nState; }
void SetState(int val) { m_nState = val; }
};
const A *A1 = new A();
A *A2 = new A();
A1->Foo(); // OK
A2->Foo(); // OK
A1->Moo(); // Error - Not allowed to call non-const function on const object instance
A2->Moo(); // OK
El const
palabra clave en una declaración de la función indica al compilador que la función está contractualmente obligado a no modificar el estado de A
. Por lo tanto, no puede llamar a funciones que no sean const
dentro de A::Foo
ni cambie el valor de las variables miembro.
Para ilustrar, Foo() no podrá invocar A::SetState
como se declara no const
, A::GetState
sin embargo está bien porque se ha declarado explícitamente const
. El miembro m_nState
no se puede cambiar a menos que se haya declarado con la palabra clave mutable
.
Un ejemplo de este uso de const
es para que las funciones 'getter' obtengan el valor de las variables miembro.
@ 1800 Información: ¡Me olvidé de mutable!
La palabra clave mutable
indica al compilador que acepte modificaciones a la variable miembro que de lo contrario causaría un error de compilación. Se usa cuando la función necesita modificar el estado, pero el objeto se considera lógicamente consistente (constante) independientemente de la modificación.
Excelente respuesta, muy clara y concisa. Tengo mi +1 –