Otros han respondido al aspecto técnico de su pregunta acerca de las funciones de miembros de const, pero aquí hay una idea más amplia, y esa es la idea de const correctness.
En pocas palabras, la precisión de la precisión se trata de aclarar y aplicar la semántica de su código. Tome un ejemplo simple. Mire esta declaración de función:
bool DoTheThing(char* message);
Supongamos que alguien más escribió esta función y necesita llamarla. ¿Sabes lo que DoTheThing()
hace a tu buffer de char? Tal vez solo registra el mensaje en un archivo, o tal vez cambia la cadena. No se puede decir cuál es la semántica de la llamada con solo mirar la declaración de la función. Si la función no modifica la cadena, entonces la declaración es const incorrecta.
Tiene un valor práctico para hacer que sus funciones también sean correctas. A saber, dependiendo del contexto de la llamada, es posible que no pueda llamar a las funciones incorrectas sin ningún truco. Por ejemplo, supongamos que usted sabe que DoTheThing()
no modifica el contenido de la cadena que se le pasa, y usted tiene este código:
void MyFunction()
{
std::string msg = "Hello, const correctness";
DoTheThing(msg.c_str());
}
El código anterior no compilará porque msg.c_str()
devuelve un const char*
. Con el fin de obtener este código para compilar, tendría que hacer algo como esto:
void MyFunction()
{
std::string msg = "Hello, const correctness";
DoTheThing(msg.begin());
}
... o peor aún:
void MyFunction()
{
std::string msg = "Hello, const correctness";
DoTheThing(const_cast<char*>(msg.c_str()));
}
ninguno de los cuales, sin duda, es 'mejor' que el código original. Pero debido a que DoTheThing()
se escribió de manera incorrecta, tiene que doblar su código alrededor de él.
Si sus variables miembro nunca cambian, ¿por qué tiene variables miembro? –
¿Porque quiere una clase que sea inmutable? Esto no es irracional. –
No soy realmente una persona de C++, por lo que era más una cuestión de interés que una pregunta "gotcha". ¿Por qué no declararías a todos tus miembros "const" si quisieras que fuera realmente inmutable? ¿O ambos declararían a los miembros como const y los métodos como const? –