これは主に2行目を扱います:ベストプラクティス、割り当て、関数パラメーターなど。
一般的な練習。const
できることはすべて作るようにしてください。または別の言い方をすれば、すべてconst
を最初から作成し、const
プログラムが機能するために必要な最小限ののセットを正確に削除します。これは、const-correctnessを達成する上で大きな助けとなり、変更してはならないものに人々が割り当てようとしたときに、微妙なバグが導入されないようにするのに役立ちます。
ペストのようなconst_cast <>は避けてください。これには1つまたは2つの正当な使用例がありますが、その数は非常に少なく、はるかに異なります。const
オブジェクトを変更しようとしている場合const
は、最初のペースでオブジェクトを宣言した人を見つけ、何が起こるかについてコンセンサスを得るために彼らと話し合って問題を解決する方がはるかに効果的です。
これは非常にきちんと割り当てにつながります。constでない場合にのみ、何かに代入できます。constであるものに割り当てたい場合は、上記を参照してください。宣言int const *foo;
とint * const bar;
さまざまなことで覚えておいてくださいconst
-ここでの他の回答はその問題を立派にカバーしているので、ここでは触れません。
関数パラメーター:
値渡し:たとえばvoid func(int param)
、呼び出し元サイトでは、どちらかを気にしません。引数は、関数を宣言するためのユースケースvoid func(int const param)
があるが、渡された値は呼び出し中に関数によって変更できないという点で、関数自体にのみ影響し、呼び出し元には影響を与えないようにすることができます。
参照渡し:たとえば、void func(int ¶m)
今では違いが出ます。宣言されたとおりfunc
、変更が許可されてparam
おり、呼び出し元のサイトは結果に対処する準備ができている必要があります。宣言をvoid func(int const ¶m)
変更して契約を変更し、func
変更できないことを保証しますparam
。つまり、渡されたものが戻ってきます。他の人が指摘したように、これは、変更したくない大きなオブジェクトを安く渡すために非常に便利です。参照を渡す方が、値の大きいオブジェクトを渡すよりもはるかに安価です。
ポインタによる受け渡し:たとえばvoid func(int *param)
およびvoid func(int const *param)
これら2つは参照の対応物とほとんど同義です。nullptr
ただし、他の契約上の保証によってinをfunc
受信しないことが保証されていない限り、呼び出された関数はチェックする必要があるという警告があります。nullptr
param
そのトピックに関する意見の一部。このようなケースで正しさを証明することは地獄のように難しいです。間違いを犯すのはあまりにも簡単です。ですから、チャンスをとらないでくださいnullptr
。常にのポインタパラメータを確認してください。あなたはあなた自身の痛みと苦しみを救い、長期的にバグを見つけるのを難しくします。そして、チェックのコストに関しては、それは非常に安価であり、コンパイラに組み込まれた静的分析がそれを管理できる場合、オプティマイザはとにかくそれを排除します。MSVCのリンクタイムコード生成、またはGCCのWOPR(私は思う)をオンにすると、プログラム全体、つまり、ソースコードモジュールの境界を越える関数呼び出しでも、プログラム全体が得られます。
結局のところ、上記のすべてが常にポインタへの参照を好む非常に堅実なケースを作ります。彼らはただずっと安全です。