El uso del especificador const
con argumentos de
funciones y valores de retorno es otro lugar donde el concepto
de constante puede resultar confuso. Si está pasando variables
por valor, utilizar const
no tiene significado para el
cliente (significa que el argumento que se pasa no puede
modificarse en la función). Si está devolviendo una variable de
un tipo derivado y utiliza el especificador const
,
significa que el valor de retorno no puede modificarse. Si pasa
o devuelve direcciones, const
impide que el
destinatario de la dirección pueda modificarse.
Puede indicar que los argumentos de funciones son constantes cuando se pasa por valor como:
void f1(const int i) { i++; // ilegal }
pero, ¿qué significa esto? Está impidiendo que el valor de la
variable original pueda ser cambiado en la función
f1()
. De todos formas, como el
argumento se pasa por valor, es sabido que inmediatamente se
hace una copia de la variable original, así que dicha
restricción se cumple implícitamente sin necesidad de usar
el especificador const
.
Dentro de la función, const
si toma un significado:
El argumento no se puede cambiar. Así que, en realidad, es una
herramienta para el programador de la función, no para el que
la usa.
Para evitar la confusión del usuario de la función, puede hacer que el argumento sea constante dentro de la función en lugar de en la lista de argumentos. Podría hacerlo con un puntero, pero la sintaxis más adecuada para lograrlo es la referencia, algo que se tratará en profundidad en el capitulo 11[FIXME:XREF].
Brevemente, una referencia es como un puntero constante que se dereferencia automáticamente, así que es como tener un alias de la variable. Para crear una referencia, debe usar el símbolo & en la definición. De ese modo se tiene una definición libre de confusiones.
void f2(int ic) { const int &i = ic; i++; // ilegal (error de compilación) }
De nuevo, aparece un mensaje de error, pero esta vez el
especificador const
no forma parte de la
cabecera de la función, solo tiene sentido en la
implementación de la función y por la tanto es invisible para
el cliente.