私の質問は、違いについてです:C++のオーバーロード添字演算子の2つのバージョン
const T& operator[](const int nIndex) const;
と:
T& operator[](const int nIndex);
は、なぜ私がクラスで定義され、それらの両方が必要になり、目的は何ですか?後者で十分でしょうか?
私の質問は、違いについてです:C++のオーバーロード添字演算子の2つのバージョン
const T& operator[](const int nIndex) const;
と:
T& operator[](const int nIndex);
は、なぜ私がクラスで定義され、それらの両方が必要になり、目的は何ですか?後者で十分でしょうか?
のようにそれの終わりにconst
とメンバ関数の宣言は、その関数が呼び出されることを可能にすることができ、あなたのオブジェクトはconst
ないとき、あなたはあなたが変更することができます要素を取得しますことを指定しますconst
オブジェクトであっても。これは、オブジェクトの状態を変更しないメンバ関数に対してのみ意味があります。
これらの演算子をオーバーロードするクラスをX
としましょう。おそらくコンテナのように動作し、含まれている要素へのアクセスをこのoperator[]
によって与えます。
今度は、ユーザーがconst X
を使用したいとしましょう:
const X x = /* fill it */;
use(x[0]);
は、ユーザーがこれを行うには許されるべきか?多分。コンテナが不変のコンテナが必要な場合は、そのコンテナを持つことができます。 のバージョンをoperator[]
に指定しなかった場合、これを行うことはできません。彼らは結局コンテナを変更しようとしていない、彼らはその内容を見ているだけです。
なぜconst
のバージョンをoperator[]
にすると、const
の参照を返しますか?それはする必要があるからです。クラス自体のメンバーへの参照を返します。コンテナはconst
だったと非const
参照を返した場合、呼び出し側はちょうどこの演算子を使用することによって、その内部を変更することができるだろう:
const X x = /* fill it */;
x[0].modify();
ああ親愛なる、我々はそれがconst
だにもかかわらずx
の状態を変更します。これは悪いですし、実際には、コンパイラはあなたにもさせてくれません。
I 2つの類似したオーバーロードされたメソッド(constとnon-const)がC++の定型文であることを追加します –
@sftrabbit:愚かなフォローアップ:constとnon-constの2つの別々の本体を定義する必要があることを正しく理解していますか?これらの団体はまったく同じものになるでしょうか?基本的には、MyDataStructure [nIndex]を返すようなsmthですか? –
@SimonRighleyはい、両方を定義する必要があります。あなたは 'const'バージョンに関して非'const'バージョンを定義することができますが、' const_cast'を実行する必要があります。重複した実装をするだけで良いのです。 –
アクセスしているオブジェクトがconst
の場合は、変更できないようにしてください。コンパイラーは、関数の非const
バージョンを呼び出させませんでした。
const vector<int> mints;
mints[3] = 5; // not allowed by compiler
それらは、クラスのメンバ関数であり、バージョンがconst
コンテキストとして使用中かどうか、そのクラスに基づいて選択されるであろう。
[]
がconst
コンテキスト内のオブジェクトで使用されている場合、このバージョンが呼び出されます。返された要素の度合いはconst
です。 []
が非const
オブジェクト上で使用される場合
const T& operator[](const int nIndex) const;
このバージョンでは、呼び出されます。これは、コードがmyObject[0] = 10;
T& operator[](const int nIndex);
最初の
CONST T &オペレータ[](CONST int型nIndex)CONST。
は定数メソッド(関数)です。すなわち、クラスメンバー変数のいずれも変更できないことを保証します(変更可能でない限り)。
定数オブジェクトだけを返すということは、定数関数のみを呼び出すことができます。つまり、上記のような末尾にconstを持つ関数だけを呼び出すことができます。
T & operator [](const int nIndex);
このメソッドは、メンバ変数を変更し、任意のクラスメソッドを呼び出すことができるオブジェクトを返します。
定数オブジェクトは定数メソッドを使用し、非定数は他のものを使用するため、両方とも必要です。
[異なる場所でのC++でのconstの意味](http://stackoverflow.com/questions/10482455/what-does-const-mean-in-c-in-differentplaces) – juanchopanza