¿Qué se entiende por "const" al final de la declaración de la función?

Tengo un libro, donde hay escrito algo como:

class Foo 
{
public:
    int Bar(int random_arg) const
    {
        // code
    }
};

¿Qué significa?

Solución

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étodo int Foo::Bar(int random_arg) (sin la const al final) resulta en una función como int Foo_Bar(Foo* this, int random_arg), y una llamada como Foo f; f.Bar(4) corresponderá internamente a algo como Foo 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 de this 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 de const sólo se aplica cuando se añade const 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 de const y la palabra clave const:

Corrección de Const

La declaración de C++ 'const': por qué & cómo

Comentarios (6)

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.

Comentarios (1)

Similar a esta pregunta.

En esencia significa que el método Bar no modificará las variables miembro no mutables de Foo.

Comentarios (0)