23

C ++の関数宣言で「const」を配置できるさまざまな場所の違いを理解するのに苦労しています。

最初の const の違いは何ですか:

const int MyClass::showName(string id){
...
}

最後に const は次のようになります。

int MyClass::showName(string id) const{
...
}

また、次のように最初と最後に const を使用した結果はどうなりますか。

const int MyClass::showName(string id) const{
...
}
4

4 に答える 4

36

const int MyClass::showName(string id)オブジェクトを返しconst intます。したがって、呼び出し元のコードは返された int を変更できません。呼び出しコードが似ている場合const int a = m.showName("id"); a = 10;、コンパイラ エラーとしてマークされます。ただし、以下の@David Heffernanが指摘したように、整数はコピーによって返されるため、呼び出しコードは使用する義務がありませんconst int. int戻り値の型として宣言して変更することができます。オブジェクトはコピーによって返されるため、戻り値の型を として宣言してもあまり意味がありませんconst int

int MyClass::showName(string id) constメソッドshowNameconstメンバー関数であることを示します。const メンバー関数は、クラスのメンバー変数を変更しない関数です ( としてマークされていない限りmutable)。したがってint m_a、クラスにメンバー変数があり、内部でMyClass実行しようとすると、コンパイラ エラーが発生します。m_a = 10;showName

3 つ目は、上記 2 つのケースの組み合わせです。

于 2012-05-23T09:11:47.803 に答える
13
  1. 戻り値にconst付随する は戻り値に適用されます。戻り値がコピーされるため、無意味な宣言であり、含めるかどうかに違いはありません。
  2. パラメーター リストのconst後の は、変更可能としてマークされていないオブジェクトの状態を関数が変更しないことを意味します。これは const メンバー関数であり、const オブジェクトがある場合、コンパイラは const オブジェクトで非 const メンバー関数を呼び出すことを許可しません。

のこれら 2 つの使用法の間に相互作用はありません。これらconstは完全に独立した構造です。

于 2012-05-23T09:10:31.597 に答える
5

違いは、constが異なるものに適用されることです。

これは、不変の定数値をshowName返すことを示しています。intもちろん、intは値によって返されるため、consthere の存在は何の役割も果たしません。

const int MyClass::showName(string id)

これはshowName、 の監視可能な状態を変更しないことを示していMyClassます (技術的には、宣言されていないメンバーは変更しませんmutable)。したがって、 type の値で呼び出すことができますconst MyClass

int MyClass::showName(string id) const

両方を使用する場合constは、上記の両方が適用されます。

于 2012-05-23T09:12:19.317 に答える