Casi todas las otras respuestas son correctas, pero pierden un aspecto de esto: cuando usa el extra consten un parámetro en una declaración de función, el compilador esencialmente lo ignorará. Por un momento, ignoremos la complejidad de que su ejemplo sea un puntero y usemos un int.
void foo(const int x);
declara la misma función que
void foo(int x);
Solo en la definición de la función es más constsignificativo:
void foo(const int x) {
// do something with x here, but you cannot change it
}
Esta definición es compatible con cualquiera de las declaraciones anteriores. A la persona que llama no le importa que xseaconst un detalle de implementación que no es relevante en el sitio de la llamada.
Si tiene un constpuntero a constdatos, se aplican las mismas reglas:
// 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
}
Pocos programadores de C ++ se molestan en crear parámetros const, incluso cuando podrían serlo, independientemente de si esos parámetros son punteros.