初心者にとって、C++ (および C)のconstの利点は何ですか?
6 に答える
const は、関数に渡されるポインターまたは参照で特に役立ちます。これは、関数が渡されたオブジェクトを変更しないという、すぐに理解できる一種の「API コントラクト」です。
参照: http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.4
関数で const 参照として使用すると、渡されたものが変更されないことを呼び出し元に知らせます。
void f(Foo &foo, const Bar &bar) { ... }
この場合、呼び出し元はfoo
が変更される可能性があることを認識しますが、 は変更しbar
ません。コンパイラは の本体をコンパイルするときにこれを強制するf()
ため、本体が変更されることbar
はなく、それを変更する可能性のある別の関数に渡されることもありません。
上記のセーフガードはすべて を使用してバイパスできますconst_cast
。そのため、そのようなキャストは「危険」(または少なくとも疑わしい) と見なされます。
かなり明白なように思えます-変更してはならないものを変更するのを防ぎます。
編集: 詳細なガイダンスについては、常にHerb Sutterを参照してください。
私は const の「安全性」の側面についてはあまり確信が持てません (賛否両論あります)....ただし、const なしでは実行できない特定の構文が許可されます。
void blah(std::string& x)
{}
std::string オブジェクトのみを取ることができます...ただし、それを const と宣言すると:-
void blah(const std::string& x) {}
あなたは今できる
blah("hello");
適切なコンストラクターを呼び出して std::string を作成します
また、const を使用して、変数またはパラメーターを使用する意図を示します。これは優れたプログラミング手法です (「C/C++ コーディング スタイルと標準」、項目 2.3)。
また、#define を使用して定数を定義し、const を使用することを避けることで、コードのタイプ セーフを向上させます。 C++ プログラミング実践ガイドライン- 項目 2.1
const のコントラクトの側面も、コンパイラのオプティマイザにとって重要です。特定の const 宣言を使用すると、ループ不変条件を含む最適化をオプティマイザーが見つけやすくなります。これが const_cast が本当に危険な理由です。