11

私の質問は、次の違いについてです。

const T& operator[](const int nIndex) const;

と:

T& operator[](const int nIndex);

クラスで両方を定義する必要があるのはなぜですか?その目的は何ですか? 後者で十分ではないでしょうか。

4

4 に答える 4

17

const末尾にメンバー関数宣言があると、constオブジェクト上でもその関数を呼び出すことができます。これは、オブジェクトの状態を変更しないメンバー関数に対してのみ意味があります。

これらの演算子をオーバーロードするクラスがと呼ばれているとしましょうX。おそらく、コンテナのように動作し、これを介して含まれる要素へのアクセスを提供しますoperator[]

const Xここで、ユーザーが:を使用したいとします。

const X x = /* fill it */;
use(x[0]);

ユーザーにこれを許可する必要がありますか?おそらく。不変のコンテナが必要な場合は、それを持たせます。constのバージョンを提供しなかった場合operator[]、彼らはこれを行うことができません。結局、彼らはコンテナを変更しようとしているのではなく、その内容を見ているだけです。

では、なぜreturnのconstバージョンを参照にするのですか?しなければならないからです。クラス自体のメンバーへの参照を返します。コンテナが非参照で返され、非参照が返された場合、呼び出し元は次の演算子を使用するだけでその内部を変更できます。operator[]constconstconst

const X x = /* fill it */;
x[0].modify();

ああ、xそれがであるにもかかわらず、私たちはの状態を変更しconstます。これは悪いことであり、実際、コンパイラはあなたにそれをさせさえしません。

于 2013-03-14T15:49:56.420 に答える
3

これらはクラスのメンバー関数であり、バージョンはそのクラスがコンテキストとして使用されているかどうかに基づいて選択されconstます。

このバージョンは、コンテキスト[]内のオブジェクトで使用されるときに呼び出されます。返された要素の-nessをconst保持します。const

const T& operator[](const int nIndex) const;

このバージョンは[]、非constオブジェクトで使用されるときに呼び出されます。オブジェクトがそうでない場合const、変更可能な要素を取得し、次のようなコードを許可することを指定しますmyObject[0] = 10;

T& operator[](const int nIndex);
于 2013-03-14T15:49:10.150 に答える
2

アクセスしているオブジェクトがconstである場合、それを変更できないようにする必要があります。constコンパイラーでは、非バージョンの関数を呼び出すことはできません。

const vector<int> mints;

mints[3] = 5; // not allowed by compiler
于 2013-03-14T15:49:06.837 に答える
2

最初の1つ

const T& operator[](const int nIndex) const;

定数メソッド(関数)です。つまり、クラスメンバー変数を変更しないことが保証されます(可変でない限り)。

また、定数オブジェクトを返します。これは、定数関数のみを呼び出すことができることを意味します。つまり、上記のものと同様に、最後に const を持つ関数のみを呼び出すことができます。

T& operator[](const int nIndex);

このメソッドはメンバー変数を変更し、任意のクラス メソッドを呼び出すことができるオブジェクトを返します。

定数オブジェクトは定数メソッドを使用し、非定数オブジェクトはもう一方を使用するため、両方が必要です。

于 2013-03-14T16:04:04.910 に答える