Почти все остальные ответы верны, но они упускают из виду один аспект: когда вы используете дополнительный constпараметр в объявлении функции, компилятор по существу проигнорирует его. На мгновение давайте проигнорируем сложность вашего примера, являющегося указателем, и просто воспользуемся расширением int.
void foo(const int x);
объявляет ту же функцию, что и
void foo(int x);
Только в определении функции есть дополнительное constзначение:
void foo(const int x) {
// do something with x here, but you cannot change it
}
Это определение совместимо с любым из приведенных выше заявлений. Вызывающего абонента это не волнует x- constэто деталь реализации, не имеющая отношения к месту вызова.
Если у вас есть constуказатель на constданные, применяются те же правила:
// 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
}
Немногие программисты на C ++ беспокоятся о создании параметров const, даже если они могут быть такими, независимо от того, являются ли эти параметры указателями.