Quase todas as outras respostas estão corretas, mas elas perdem um aspecto disso: quando você usa o extra const
em um parâmetro em uma declaração de função, o compilador irá essencialmente ignorá-lo. Por um momento, vamos ignorar a complexidade do seu exemplo ser um ponteiro e apenas usar um int
.
void foo(const int x);
declara a mesma função que
void foo(int x);
Apenas na definição da função o extra é const
significativo:
void foo(const int x) {
// do something with x here, but you cannot change it
}
Esta definição é compatível com qualquer uma das declarações acima. O chamador não se importa que x
é const
--que é um detalhe de implementação não é relevante no site da chamada.
Se você tiver um const
ponteiro para const
dados, as mesmas regras se aplicam:
// these declarations are equivalent
void print_string(const char * const the_string);
void print_string(const char * the_string);
// In this definition, you cannot change the value of the pointer within the
// body of the function. It's essentially a const local variable.
void print_string(const char * const the_string) {
cout << the_string << endl;
the_string = nullptr; // COMPILER ERROR HERE
}
// In this definition, you can change the value of the pointer (but you
// still can't change the data it's pointed to). And even if you change
// the_string, that has no effect outside this function.
void print_string(const char * the_string) {
cout << the_string << endl;
the_string = nullptr; // OK, but not observable outside this func
}
Poucos programadores C ++ se preocupam em criar parâmetros const
, mesmo quando poderiam ser, independentemente de esses parâmetros serem ponteiros.