71

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

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

4

5 に答える 5

39

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

于 2008-10-30T18:20:40.740 に答える
26

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

于 2008-10-30T18:06:25.683 に答える
9

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

于 2008-10-31T10:32:46.630 に答える
5

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

于 2008-10-30T18:07:43.280 に答える