Editar
Como MM comentou, nos parâmetros nos protótipos o const
é ignorado. A fonte editada da resposta original (veja abaixo) mostra isso:
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;
}
Não há nenhuma mensagem de erro.
De qualquer forma, deixarei o original no lugar, na esperança de que possa ajudar.
Original
O const
parâmetro at torna esse parâmetro somente leitura dentro da função.
Por exemplo:
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 fonte não será compilada sem mensagem de erro.
A função correct()
lerá o valor fornecido, alterará seu sinal e retornará o valor negado.
A função erroneous()
parece efetivamente fazer o mesmo, exceto que há uma atribuição ao parâmetro. Mas, como o parâmetro é, const
isso não é permitido.
Em seguida, a função changer()
funcionará como as duas anteriores, mas não apresenta erros.
Vejamos o site de chamadas:
float f = 3.14159;
float g = correct(f); // or erroneous(f) or changer(f)
A variável f
dada como um argumento será copiado para o parâmetro value
. Isso nunca mudará, mesmo que changer()
seja chamado.
Você pode considerar os parâmetros como algum tipo de variável local. Na verdade, eles são manipulados dessa maneira no código de máquina gerado.
Então, por que você vê const
às vezes? Você vê se um ponteiro é definido como parâmetro.
Quando você não deseja que o valor apontado seja alterado, é necessário adicionar const
; mas faça-o na posição correta!
void effective(int const * pointer);
void futile(int * const pointer);
void possible_but_overly_restricted(int const * const pointer);
const
é redundante aqui, o que você imagina está acontecendo?