Editar
Como se ha comentado MM, en parámetros en prototipos el const
se ignora. La fuente editada de la respuesta original (ver más abajo) muestra esto:
float correct(float const value);
float erroneous(float const value);
float changer(float value);
float correct(float value) {
return -value;
}
float erroneous(float value) {
value = -value;
return value;
}
float changer(float value) {
value = -value;
return value;
}
No hay ningún mensaje de error.
De todos modos, dejaré el original en su lugar con la esperanza de que pueda ayudar.
Original
El const
parámetro at a hace que este parámetro sea de solo lectura dentro de la función.
Por ejemplo:
float correct(float const value) {
return -value;
}
float erroneous(float const value) {
value = -value;
return value;
}
float changer(float value) {
value = -value;
return value;
}
Esta fuente no se compilará sin un mensaje de error.
La función correct()
leerá el valor dado, cambiará su signo y devolverá el valor negado.
La función erroneous()
parece hacer efectivamente lo mismo, excepto que hay una asignación al parámetro. Pero como el parámetro es const
esto no está permitido.
A continuación, la función changer()
funcionará como las dos anteriores, pero no da errores.
Veamos el sitio de la llamada:
float f = 3.14159;
float g = correct(f); // or erroneous(f) or changer(f)
La variable f
dada como argumento se copiará en el parámetro value
. Nunca cambiará incluso si changer()
se llamará.
Es posible que desee ver los parámetros como algún tipo de variables locales. En realidad, se manejan principalmente de esta manera en el código de máquina generado.
Entonces, ¿por qué ves a const
veces? Lo verá si un puntero se define como parámetro.
Cuando no desea que se cambie el valor señalado , debe agregarlo const
; pero hazlo en la posición correcta!
void effective(int const * pointer);
void futile(int * const pointer);
void possible_but_overly_restricted(int const * const pointer);
const
es redundante aquí, ¿qué imaginas que está pasando?