2016-04-12 8 views
8

私はconstの意味を、関数への参照によって渡されなければならないポインタまたは構造体について理解しています。しかし、この例では:void foo(const int a)のconstは何をしますか?

void foo(const int a); 

変数aがスタックに渡されます。スタックの内容を変更する呼び出し元に害はありません。constはこの状況ではかなり役に立たないように見えます。私はaを変更できない場合

さらに、私はまだのコピーを作成し、このコピーを変更することができます。

void foo(const int a) 
{ 
    int b = a; 
    b++; 
} 

スカラー関数の引数に適用されたときconstキーワードが有用であろうんどのような状況では(ポインタではない)?

+0

何かを行うことができても、それを行うべきであるとは限りません。この場合、他の人が述べたように、それは有用かもしれません。 – Transcendental

答えて

4

void foo(const int a)のようなコードは、実際には意味がありませんし、「const correctness」もそうではありません。

時には過度にペタントなプログラマーは、共通パラメーターをconstと宣言する必要があるという奇妙な考えを、関数が実際のパラメーターを変更しないという理由だけで得ることがあります。しかし、ほとんどの場合、関数はそうではありません。

ポイントは、変数はコピーオリジナルのものなので、あなたの機能はそれほど問題ではありません!

これは自己文書化コードを書くことさえありません。なぜなら、呼び出し元にあなたの関数内部で何が起こっているのかを伝えることだけだからです。発信者は気にしないで気にしないでください。

+2

私は個人的には、関数のパラメータに 'const'修飾子をたくさん使用しています。基本的には、関数本体のパラメータをまったく変更する必要がないたびにです。これは、より良いコードを生成するためにいくつかのCコンパイラを助けるために使用されましたが、それは私がそれをする理由ではありません。私はそれが人間がコードを読むときに役立つからです。値が変更されたかどうかを慎重に調べる代わりに、 'const'は呼び出し側が指定した値にとどまると安全に仮定します。それが私のコーディングスタイルに統合された理由です。もしそれが*過度に賢い*であれば、そうであるように。 –

+0

@NominalAnimal人間がコードを関数プロトタイプに読み込むのに役立つわけではありません。そこには全く意味がありません。 – juanchopanza

+0

@NominalAnimal私は、('restrict'などとは違って)より良いコードを生成するためにコンパイラを助けたことを非常に疑っています。また、変数が変更されたかどうかを知るために関数をゆっくりと慎重に読む必要がある場合は、その関数を複数に分割する必要があります。 – Lundin

1

ほとんどの場合、コードを自己文書化する目的で役に立ちます。

将来のために、constは、foo()のコードのどれもaを修正しようとしないように、あなたの意図を強調するように働きます。

+0

「人」(発信者)は、自分の機能が内部的にどのように実装されているかを気にするのはなぜですか?それは彼らのビジネスのどれでもなく、彼らはあまり気にすることができませんでした。 – Lundin

+0

"人"もコードの魔術師かもしれません。 – atturri

+0

*実装*のみを文書化することができます。関数宣言では無視されます。 – juanchopanza

3

値パラメータにconstを使用する必要はありませんが、必要なものがコードで保証するものであれば、その値があります。

Hereそれは、関数の実装は、関数が値によって受けた入力パラメータaの値を変更しないことを意味し、ユースケース

2

のいくつかの例との答えがあります。

プログラムの安定性が向上する可能性があります。

(個人的に私はスタイルがあまりにも冗長であると嫌いです)。

あなたはは、あなたが唯一の機能定義のパラメータリストにconstを配置する必要があることにも注意し、その後、このスタイルを採用しない場合は、宣言でそれを必要としませ

+0

値はスタックに渡されます。定義によって、実装者は 'a'の値を変更することはできません。 – nowox

+0

ある意味では、関数によって 'a'の値を変更することはできません。 – Bathsheba

+3

"プログラムの安定性が向上する可能性があります"どのようにですか? – Lundin

2

これは、任意の定数、変数

const int size = some_other_variable + 5; 

あなたがそれらの値は変更されません知っていればconstとして変数を宣言するのは良いプログラミングの練習での宣言と同じことです。こうすることで、誰かが誤って関数の値段を下げることを避けることができます。

関連する問題