¿Qué se entiende por "const" al final de la declaración de la función?
Posible duplicado: ¿Significado de “const” último en una declaración de método C++?
Tengo un libro, donde hay escrito algo como:
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
¿Qué significa?
495
3
Una "función const", denotada con la palabra clave
const
después de una declaración de función, hace que sea un error del compilador que esta función de clase cambie una variable miembro de la clase. Sin embargo, la lectura de una variable de clase está bien dentro de la función, pero la escritura dentro de esta función generará un error del compilador.Otra forma de pensar en este tipo de "función const" es ver una función de clase como una función normal que toma un puntero implícito
this
. Así, un métodoint Foo::Bar(int random_arg)
(sin la const al final) resulta en una función comoint Foo_Bar(Foo* this, int random_arg)
, y una llamada comoFoo f; f.Bar(4)
corresponderá internamente a algo comoFoo f; Foo_Bar(&f, 4)
. Ahora añadiendo la const al final (int Foo::Bar(int random_arg) const
) se puede entender como una declaración con un puntero const this:int Foo_Bar(const Foo* this, int random_arg)
. Como el tipo dethis
en este caso es const, no es posible modificar las variables miembro.Es posible aflojar la restricción "const function" de no permitir que la función escriba en cualquier variable de una clase. Para permitir que algunas de las variables sean escribibles incluso cuando la función está marcada como una "función const", estas variables de clase se marcan con la palabra clave
mutable
. Así, si una variable de clase está marcada como mutable, y una "función const" escribe en esta variable, el código compilará limpiamente y la variable es posible de cambiar. (C++11)Como es habitual cuando se trata de la palabra clave
const
, cambiar la ubicación de la palabra clave const en una sentencia C++ tiene significados totalmente diferentes. El uso anterior deconst
sólo se aplica cuando se añadeconst
al final de la declaración de la función después del paréntesis.const
es un calificador muy sobreutilizado en C++: la sintaxis y la ordenación no suelen ser sencillas en combinación con los punteros. Algunas lecturas sobre la corrección deconst
y la palabra claveconst
:Corrección de Const
La declaración de C++ 'const': por qué & cómo
Se garantiza que
Bar
no cambiará el objeto sobre el que se invoca. Véase la sección sobre la corrección de const en el C++ FAQ, por ejemplo.Similar a esta pregunta.
En esencia significa que el método
Bar
no modificará las variables miembro no mutables deFoo
.