const-correctnessはC++における概念で、変数、ポインタ、参照、メソッドが「読み取り専用」としてマークされる方法を定義します。これはコードの安全性を高め、クラスインターフェースをより理解しやすくし、コンパイラが実行時ではなくコンパイル時にエラーを検出するのを可能にします。
const修飾子の使用は重要です。なぜなら:
例:
class MyArray { public: int getItem(size_t idx) const { // オブジェクトを変更しない return arr[idx]; } void setItem(size_t idx, int value) { arr[idx] = value; } private: int arr[10]; };
ここでgetItemメソッドはオブジェクトを変更しないことを保証します。
次の2つはどう違いますか?
void foo(const int* ptr);と
void foo(int* const ptr);?
正しい答え:
const int* ptr — 定数値へのポインタで、値は変更できないが、ポインタは変更可能です。int* const ptr — 変更可能な値への定数ポインタで、ポインタは変更できず、値は変更可能です。物語
大規模プロジェクトでconst修飾子なしにクラスメソッドを書くミスがありました:int MyClass::getVal();そのため、クラスのオブジェクトをconst参照として使用することができませんでした。これは「読み取り専用」のオブジェクトで動作する関数を制限し、コードの再利用を制限し、オブジェクトの過剰なコピーを引き起こしました。
物語
開発者が間違って非constメソッドを介して内部データへの参照を返しました:int& MyClass::getInt();結果として、クライアントコードはクラスのプライベートフィールドを変更する機会を得てしまい、予期しない状態の変更やトリッキーなバグを引き起こしました。
物語
定数パラメータをconstなしで関数に残したため:void printVector(std::vector<int>& v);誰かがデバッグのために関数内で誤ってベクターを変更したため、このコードを削除するのを忘れました。これは副作用を引き起こし、テストではほとんど気づかれず、プロダクションでのみ発見されました。