ProgrammingC++開発者

const-correctnessはC++でどのように機能しますか?const修飾子を使用することがなぜ重要で、const-correctnessはどのようなエラーを回避するのに役立ちますか?メソッドや関数でのconstの実際の使用例を挙げてください。

Hintsage AIアシスタントで面接を突破

答え。

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);

誰かがデバッグのために関数内で誤ってベクターを変更したため、このコードを削除するのを忘れました。これは副作用を引き起こし、テストではほとんど気づかれず、プロダクションでのみ発見されました。