web-dev-qa-db-ja.com

C ++でのconstオーバーロードの使用は何ですか?

C++では、関数のシグネチャは、constであるかどうかに部分的に依存します。つまり、1つのクラスがconstであり、他のconstが異なることを除いて、クラスは2つのメンバー関数を持つことができます。このようなクラスがある場合、コンパイラーは、呼び出す関数に基づいて、呼び出す関数を決定します。それがクラスのconstインスタンスである場合、関数のconstバージョンが呼び出されます。オブジェクトがconstでない場合、他のバージョンが呼び出されます。

この機能をどのような状況で利用したいですか?

56
Tommy Herbert

これは、メンバー関数がクラスのデータメンバー(またはメンバーのメンバー、メンバーのメンバーのメンバーなど)へのポインターまたは参照を返す場合にのみ意味があります。一般に、const以外のポインターまたはデータメンバーへの参照を返すことは避けられますが、場合によっては合理的であるか、単に非常に便利です([]演算子など)。そのような場合、ゲッターのconstバージョンと非constバージョンを提供します。このようにして、オブジェクトを変更できるかどうかの決定は、それを使用する関数に依存します。constまたはnon-constを宣言することを選択できます。

29
Dima

そこにあるので、コンパイラーにconstオブジェクトと通常のオブジェクトのどちらを返すかを強制し、それでも同じメソッドシグネチャを維持できます。 Const Correctness に詳細な説明があります。

24
Bill the Lizard

Std :: map :: operator []の動作を確認してください。無効なキーを参照しようとするとconstバージョンはエラーをスローしますが、非constバージョンは挿入を行います。挿入動作はstd :: map :: insertを使用する必要がある場合よりもはるかに便利です(さらに、上書きが行われます)が、constマップに対しては機能しません。

5
RobH