3

私は現在、クラスの 1 つで C++ の動的メモリを使用して二重リンク リストを作成しています。私はすでにコードを書いていますが、質問がありました。

私たちの教授は、私たちに両方を書くように要求しました

int& operator[](int position) 

int operator[](int position) const

関数。

同じオペレーターに対して 2 つの機能を実行することのポイントは何でしたか? その背後にはある種のロジックがあるに違いありません(笑)。a = arr[i] を実行し、arr[i] = a も実行できるようにするためですか?

4

6 に答える 6

4

リスト オブジェクトがある場合はconst、そこから値を読み取ることしかできないはずです。変更可能なものがある場合は、値の読み取りと書き込みの両方ができるはずです。const1 つ目は、オブジェクトに対して呼び出されるバージョンで行われconstます。

于 2013-09-25T20:54:54.400 に答える
0

修飾子 (一般に「const オブジェクト」と呼ばれます)で定義されているか、または const へのポインターまたは const への参照を介して参照されている二重リンク リスト オブジェクトがあるconst場合、読み取りを有効にしたいが、書き込み。-const修飾された演算子がそれを行います。

修飾子なしで定義されたオブジェクトconst、または非 const へのポインターまたは非 const への参照を介して参照されるオブジェクトがある場合、読み取りと書き込みの両方を有効にする必要があります。非const修飾演算子がそれを行います。

したがって、わざわざ 2 つのオーバーロードを作成する理由は、両方の動作を実装するためです。

constness に関係なく読み取りのみが必要な場合は、constバージョンのみを記述します。これは、修飾constされたメンバー関数を使用して両方のケースとやり取りできるのに対し、const修飾されていないメンバー関数は、修飾されていconstないオブジェクト (または、非 const へのポインターまたは非 const への参照を介して)。

非オブジェクトにのみoperator[]適用したい場合は、非修飾バージョンのみを記述します。オブジェクトを変更可能にする必要があるとは思わないため、これは奇妙に思えるかもしれませんが、実際には、これはまさに で行われることです。constconstoperator[]std::mapoperator[]

于 2013-09-25T22:09:30.770 に答える
0

それは私ができることでありa = arr[i]、またできることarr[i] = aですか?

はい、そのためです。

  • constまたは非リストがある場合は、割り当てconstを実行できます。a = arr[i]
  • を返す演算子のバージョンは、int&を実行できるようにするためのものです。arr[i] = aこれにはもちろん非constリストが必要です。
于 2013-09-25T20:52:40.927 に答える
0

1)constバリアントは、変数に値を代入する場合などの読み取り用です。指定されたインデックスでリスト値を変更しようとすると、コンパイラはエラーを返します。const の例はa = arr[i]あなたが書いたとおりです。

2)non-const variantリストの特定のインデックスに実際に値を設定するときに通常使用されます。このバリアントを使用して値を取得することもできますが。ただし、意図的に読み取るだけで、コードが誤って書き込む場合、コンパイラはエラーを発生させません。そのような場合に使用することで回避できる微妙なバグにつながる可能性がありますconst。非 const の例はarr[i] = a、あなたが書いたとおりです。

両方のバージョンが存在する場合、非 const オブジェクトでインデックス付けを実行すると、非 const バージョンのバージョンが読み取り用に呼び出されます。

于 2013-09-25T20:53:04.070 に答える