私の質問は、次の違いについてです。
const T& operator[](const int nIndex) const;
と:
T& operator[](const int nIndex);
クラスで両方を定義する必要があるのはなぜですか?その目的は何ですか? 後者で十分ではないでしょうか。
私の質問は、次の違いについてです。
const T& operator[](const int nIndex) const;
と:
T& operator[](const int nIndex);
クラスで両方を定義する必要があるのはなぜですか?その目的は何ですか? 後者で十分ではないでしょうか。
const
末尾にメンバー関数宣言があると、const
オブジェクト上でもその関数を呼び出すことができます。これは、オブジェクトの状態を変更しないメンバー関数に対してのみ意味があります。
これらの演算子をオーバーロードするクラスがと呼ばれているとしましょうX
。おそらく、コンテナのように動作し、これを介して含まれる要素へのアクセスを提供しますoperator[]
。
const X
ここで、ユーザーが:を使用したいとします。
const X x = /* fill it */;
use(x[0]);
ユーザーにこれを許可する必要がありますか?おそらく。不変のコンテナが必要な場合は、それを持たせます。const
のバージョンを提供しなかった場合operator[]
、彼らはこれを行うことができません。結局、彼らはコンテナを変更しようとしているのではなく、その内容を見ているだけです。
では、なぜreturnのconst
バージョンを参照にするのですか?しなければならないからです。クラス自体のメンバーへの参照を返します。コンテナが非参照で返され、非参照が返された場合、呼び出し元は次の演算子を使用するだけでその内部を変更できます。operator[]
const
const
const
const X x = /* fill it */;
x[0].modify();
ああ、x
それがであるにもかかわらず、私たちはの状態を変更しconst
ます。これは悪いことであり、実際、コンパイラはあなたにそれをさせさえしません。
これらはクラスのメンバー関数であり、バージョンはそのクラスがコンテキストとして使用されているかどうかに基づいて選択されconst
ます。
このバージョンは、コンテキスト[]
内のオブジェクトで使用されるときに呼び出されます。返された要素の-nessをconst
保持します。const
const T& operator[](const int nIndex) const;
このバージョンは[]
、非const
オブジェクトで使用されるときに呼び出されます。オブジェクトがそうでない場合const
、変更可能な要素を取得し、次のようなコードを許可することを指定しますmyObject[0] = 10;
T& operator[](const int nIndex);
アクセスしているオブジェクトがconst
である場合、それを変更できないようにする必要があります。const
コンパイラーでは、非バージョンの関数を呼び出すことはできません。
const vector<int> mints;
mints[3] = 5; // not allowed by compiler
最初の1つ
const T& operator[](const int nIndex) const;
定数メソッド(関数)です。つまり、クラスメンバー変数を変更しないことが保証されます(可変でない限り)。
また、定数オブジェクトを返します。これは、定数関数のみを呼び出すことができることを意味します。つまり、上記のものと同様に、最後に const を持つ関数のみを呼び出すことができます。
T& operator[](const int nIndex);
このメソッドはメンバー変数を変更し、任意のクラス メソッドを呼び出すことができるオブジェクトを返します。
定数オブジェクトは定数メソッドを使用し、非定数オブジェクトはもう一方を使用するため、両方が必要です。