編集する
MMがコメントしたように、プロトタイプのパラメーターでconst
は無視されます。元の回答の編集されたソース(以下を参照)はこれを示しています。
float correct(float const value);
float erroneous(float const value);
float changer(float value);
float correct(float value) {
return -value;
}
float erroneous(float value) {
value = -value;
return value;
}
float changer(float value) {
value = -value;
return value;
}
エラーメッセージはありません。
とにかく、私はそれが役立つことを願って元の場所に残しておきます。
元の
const
パラメータでは、この可能パラメータの読み取り専用関数内を。
例えば:
float correct(float const value) {
return -value;
}
float erroneous(float const value) {
value = -value;
return value;
}
float changer(float value) {
value = -value;
return value;
}
このソースは、エラーメッセージなしでコンパイルされません。
関数correct()
は、指定された値を読み取り、その符号を変更して、否定された値を返します。
関数erroneous()
は、パラメーターへの割り当てがあることを除いて、実質的に同じように動作するようです。しかし、パラメーターがそうであるため、const
これは許可されません。
次に、関数changer()
は以前と同じように機能しますが、エラーは発生しません。
呼び出しサイトを見てみましょう:
float f = 3.14159;
float g = correct(f); // or erroneous(f) or changer(f)
f
引数として与えられた変数はパラメータにコピーされますvalue
。changer()
呼び出されても変化しません。
パラメータをある種のローカル変数として見たい場合があります。実際には、生成されたマシンコードではほとんどがこのように処理されます。
それで、なぜあなたはconst
時々見ますか?ポインターがパラメーターとして定義されている場合に表示されます。
指す値を変更したくない場合は、を追加する必要がありconst
ます。しかし、正しい位置でそれをしてください!
void effective(int const * pointer);
void futile(int * const pointer);
void possible_but_overly_restricted(int const * const pointer);
const
ここでは冗長ですが、何が起こっているのですか?