Historia de la cuestión:
El calificativo const en C++ surgió por razones de seguridad: para marcar aquellas funciones que garantizan no cambiar el estado interno del objeto. En el contexto de las clases, los métodos const son obligatorios para proyectos que requieren una estricta encapsulación y protección contra errores accidentales.
Problema:
Si olvidas marcar los getters, funciones auxiliares y métodos de verificación como const, no podrás llamarlos para un objeto const. Sin los métodos const, el compilador no podrá prevenir cambios no deseados en los datos.
Solución:
Añadir const en la declaración del método de la clase después de la firma (¡y no antes!). Esto permite llamar al método tanto para objetos normales como para aquellos declarados como const, eliminando los errores de cambio de estado. Dentro de un método así no se pueden modificar los miembros de la clase (excepto los mutable), solo se puede leer.
Ejemplo de código:
class Counter { int value; public: int getValue() const { return value; } // Se puede llamar para const Counter }; void print(const Counter& c) { std::cout << c.getValue(); }
Características clave:
¿Dónde se coloca const en el método: antes del tipo de retorno o después de los paréntesis?
Solo después de los paréntesis: int getValue() const; — es un error ponerlo antes del tipo de retorno (por ejemplo, const int get();).
¿Puede un método const llamar a métodos no const de la clase?
No, un método const solo puede llamar a otros métodos const si el objeto es const.
¿Cuál es la diferencia entre const en un método y const en el valor de retorno?
int get() const (el método no cambia el estado)
const int get(); (el valor retornado no se puede cambiar, pero el método puede cambiar datos internos)
En la clase se olvidó el const en un método que no cambia el estado. No se puede llamar para un objeto constante, lo que impide usar la clase en herramientas de análisis y al trabajar con API.
Ventajas:
Desventajas:
Todos los getters, verificaciones y métodos auxiliares están declarados con const, las pruebas están cubiertas para objetos const y no const.
Ventajas:
Desventajas: