Fast alle anderen Antworten sind korrekt, aber sie übersehen einen Aspekt davon: Wenn Sie das Extra constfür einen Parameter in einer Funktionsdeklaration verwenden, ignoriert der Compiler es im Wesentlichen. Lassen Sie uns für einen Moment die Komplexität Ihres Beispiels als Zeiger ignorieren und einfach einen verwenden int.
void foo(const int x);
deklariert die gleiche Funktion wie
void foo(int x);
Nur in der Definition der Funktion ist das besonders constaussagekräftig:
void foo(const int x) {
// do something with x here, but you cannot change it
}
Diese Definition ist mit einer der obigen Erklärungen vereinbar. Der Anrufer ist es egal, dass xistconst ein Implementierungsdetail, das am Anrufort nicht relevant ist.
Wenn Sie einen constZeiger auf constDaten haben, gelten dieselben Regeln:
// 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
}
Nur wenige C ++ - Programmierer machen sich die Mühe, Parameter zu consterstellen, selbst wenn dies möglich ist, unabhängig davon, ob diese Parameter Zeiger sind.