51


21

Cでは、関数のシグネチャは、それがconstであるかどうかに部分的に依存します。 つまり、クラスは、一方がconstで、他方がそうではないという点を除いて、同一のシグニチャーを持つ2つのメンバー関数を持つことができます。 あなたがこのようなクラスを持っているならば、それからあなたがそれを呼び出すオブジェクトに基づいてどの関数を呼び出すべきか決定するでしょう:それがクラスのconstインスタンスであるならば、関数のconstバージョンは呼ばれるでしょう。オブジェクトがconstでない場合は、他のバージョンが呼ばれます。

どのような状況でこの機能を利用したいと思うでしょうか。

4 Answer


24


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


24


メンバー関数がクラスのデータメンバー(またはメンバーのメンバー、またはメンバーのメンバーのメンバー)へのポインタまたは参照を返す場合にのみ、これは意味があります。 等。)。 一般的に、constでないポインタまたはデータメンバへの参照を返すことは眉をひそめますが、時にはそれが妥当であるか、または単に非常に便利です(例: []演算子) そのような場合には、getterのconstバージョンと非constバージョンを用意します。 このように、オブジェクトを変更できるかどうかの決定は、それを使用している関数にかかっています。これには、constまたはnon-constのどちらを宣言するかの選択肢があります。


5


オブジェクトへのconst参照を返すかどうかを決定するためにそれを使用することができます。 STLのコンテナは、constオーバーロードされたbegin()およびend()関数を使用して、const_iteratorまたは通常のイテレータのどちらを返すかを決定します。


4


std

map :: operator []の振る舞いを見てください。 無効なキーを参照しようとすると、constバージョンはエラーをスローしますが、非constバージョンは挿入を行います。 挿入の振る舞いはstd :: map :: insertを使うよりもはるかに便利です(そして上書きもします)が、constマップでは動作しません。