2013-03-14 5 views
8

私の質問は、違いについてです:C++のオーバーロード添字演算子の2つのバージョン

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

と:

T& operator[](const int nIndex); 

は、なぜ私がクラスで定義され、それらの両方が必要になり、目的は何ですか?後者で十分でしょうか?

+0

[異なる場所でのC++でのconstの意味](http://stackoverflow.com/questions/10482455/what-does-const-mean-in-c-in-differentplaces) – juanchopanza

答えて

15

のようにそれの終わりに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の状態を変更します。これは悪いですし、実際には、コンパイラはあなたにもさせてくれません。

+0

I 2つの類似したオーバーロードされたメソッド(constとnon-const)がC++の定型文であることを追加します –

+0

@sftrabbit:愚かなフォローアップ:constとnon-constの2つの別々の本体を定義する必要があることを正しく理解していますか?これらの団体はまったく同じものになるでしょうか?基本的には、MyDataStructure [nIndex]を返すようなsmthですか? –

+1

@SimonRighleyはい、両方を定義する必要があります。あなたは 'const'バージョンに関して非'const'バージョンを定義することができますが、' const_cast'を実行する必要があります。重複した実装をするだけで良いのです。 –

2

アクセスしているオブジェクトがconstの場合は、変更できないようにしてください。コンパイラーは、関数の非constバージョンを呼び出させませんでした。

const vector<int> mints; 

mints[3] = 5; // not allowed by compiler 
3

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

[]constコンテキスト内のオブジェクトで使用されている場合、このバージョンが呼び出されます。返された要素の度合いはconstです。 []が非constオブジェクト上で使用される場合

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

このバージョンでは、呼び出されます。これは、コードがmyObject[0] = 10;

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

最初の

CONST T &オペレータ[](CONST int型nIndex)CONST。

は定数メソッド(関数)です。すなわち、クラスメンバー変数のいずれも変更できないことを保証します(変更可能でない限り)。

定数オブジェクトだけを返すということは、定数関数のみを呼び出すことができます。つまり、上記のような末尾にconstを持つ関数だけを呼び出すことができます。

T & operator [](const int nIndex);

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

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

関連する問題