この質問は Javaのfinal
に関する質問 に触発されています。
C/C++では、可能な限りconst
を使用する必要がありますか?
私はすでに関連する質問があることを知っています パラメータでのconst
の使用について 。残念ながら、その質問とその回答は関数のパラメーターに関するものだけなので、私の質問には完全には答えませんが、他のケース(たとえば、ローカル変数)についても知りたいです。
また、その質問に対するほとんどすべての回答は、変数のアクセス可能性に関する有用な情報が含まれているため、const
を使用する必要があると述べています。しかし、これは Javaでのfinalの使用に関する回答 と競合しているようです。これは、final
に余分な情報が含まれていない場合は不必要であり、コードを短くするために省略する必要があることを示しています。そしてきれい。
それで、可能な限りconst
を使用する必要がありますか?もしそうなら、なぜC++のconst
のアドバイスがJavaのfinal
のアドバイスと異なるのですか?
まず、Javaのfinal
を参照したので、これはconst
とはまったく異なります。最終は参照が変更できないことを意味しますが、可変性については何も述べていません。 Constはさらに、「const参照は変更できない」と言っており、これははるかに強力な保証です。 Javaでこれを行うには、内部状態が最終であり、構築時に決定される必要があります。 Constははるかに使いやすく、既存のオブジェクトをconst参照に「昇格」できます。
はい、可能な限りconstを使用してください。それはあなたのコードが何かを変えないという契約をします。 constパラメータを受け付ける関数に非const変数を渡すことができることを覚えておいてください。いつでもconstを追加できますが、削除することはできません(constキャストがなければ、これは非常に悪い考えです)。
Const-correctnessは時々退屈かもしれませんが、それは不変性を保証するのに役立ちます。これは、スレッドがオブジェクトを共有するマルチスレッドコードでは重要です。特定のタスクをより効率的にします。状態をコピーする代わりに、同じ不変オブジェクトを再利用するだけです。ライブラリは、プログラマにライブラリの根拠であるブラックホールで予期しない方法でオブジェクトが変更されないことを保証するために、constパラメータを受け入れる場合があります。
個人的には、const
を使用すると、書き込みにほとんど時間がかからず、通常、コードが変数を変更しているかどうかを確認するよりもはるかに短い時間で済みます。偶然に最後のイテレータ?など)
Constの使用法に厳密であることは、重要な初期化を行うヘルパー関数の作成など、他の方法でより良いコードに導くことにも気づきました。
他のポスターには同意しないので、ローカル変数とパラメータにしないでくださいトップレベルのconst
を使用することをお勧めします。 (constへの参照とポインタ、つまりconst T&
は異なります。正確性を保つために、必要に応じて常に使用してください。)
トップレベルのconst
の利点は次のとおりです。
欠点は次のとおりです。
「疑似定数」変数、つまり直接構築よりも複雑な方法で初期化されているが、後で変更されていない変数では使用できません。 getline
を使用:
std::string line; // cannot be const
std::getline(std::cin, line);
// line should be const from here on out
関数の呼び出しと戻りでの移動最適化を防止します。
std::string f1();
std::string f2(std::string s);
std::string f3() {
const std::string s = f1(); // s is not meant to be modified
// but I still want the move optimization here:
const std::string result = f2(std::move(s)); // this doesn't move
// and I want the compiler to move out here:
return result; // this will probably RVO, but if not, the move
// constructor will not be used due to the const
}
ローカルconst
が頻繁に使用されるコードベースで作業しましたが、まったく役に立たないことに気付きましたが、コードは上記のように微妙な悲観化で埋められました。個人的には、できるだけ変数を変更せず、変数の使用法が明白になるほど関数を小さくするという一般的なポリシーを採用することを好みます。また、変数が変更されても、関数の複雑さは低いため、 -問題。
const
キーワードは、パラメーターと同様に、ローカル変数に使用する必要があります。次の理由で役立ちます。
const
は1秒で記述できるので、たいしたことではありません。ここには正解/不正解はありません。あなたのリンクでは、賛成票が最も多かった回答者がfinal
をローカルで使用するべきではありません。ただし、次の回答者は強く推奨しました。
関数がsimpleおよびtrivialの場合、const
を追加しないでください。誰もがあなたの意図を理解しているからです。ただし、関数のロジックが重要な場合は、キーワードを使用する必要があります。失うものはほとんどありません。