他のほとんどすべての答えは正しいですが、これらの1つの側面が欠け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
}
const
それらがパラメーターであるかどうかに関係なく、たとえ可能であったとしても、パラメーターを作成することに煩わしいC ++プログラマーはほとんどいません。