2013-10-08 13 views
12

トピックがあります。私は混乱しています。これは、constバージョンと非constバージョンの演算子オーバーロードです。ConstおよびNon-Const演算子オーバーロード

// non-const 
double &operator[](int idx) { 
    if (idx < length && idx >= 0) { 
     return data[idx]; 
    } 
    throw BoundsError(); 
} 

私はクラスのこの機能部分は、インデックスをとり、その論理は、クラス内の配列データのインデックスを返すことを確認することを理解します。同じ本体で関数呼び出しがある関数もあります

const double &operator[](int idx) const 

なぜ2つのバージョンが必要ですか?

このサンプルの質問もまた詳しく説明します。 以下の各インスタンスでどのバージョンが使用されていますか?我々はa[0]またはa[1]を修正するリスクにしたくないので、constのバージョンでのみa[2]で呼び出され

Array a(3); 
a[0] = 2.0; 
a[1] = 3.3; 
a[2] = a[0] + a[1]; 

私の仮説。

ありがとうございました。

+1

出力の中で呼び出されたものを簡単にチェックすることができます。 – chris

+0

それは講義スライドにありますので、私はそれらを利用するためのクラスを作成する必要はないと思っています。代わりに誰かが私たちがなぜこれを行うのか理解できるように助けてください –

+3

怠け者ではなく、より良い。 –

答えて

15

両方のバージョンが利用可能な場合、ロジックはかなり簡単です。constバージョンがconstオブジェクトに対して呼び出され、非constバージョンが非constオブジェクトに対して呼び出されています。それで全部です。

コードサンプルでaは非constオブジェクトです。つまり、すべての場合に非constバージョンが呼び出されます。 constのバージョンはで、決してと呼ばれています。

2つのバージョンを持つ点は、constオブジェクトに対しては「読み取り/書き込み」アクセスを実装し、constオブジェクトに対しては「読み取り」アクセスのみを実装することです。 constの場合はconstのバージョンoperator []が呼び出され、const double &という参照が返されます。あなたはそのconst参照を通してデータを読むことができますが、あなたはそれを書き込むことはできません。

+0

私は分かりません - 私はそれが困難であることがわかりました。このライブデモをご覧ください:http://coliru.stacked-crooked.com/a/1c820d80113bc9e3 –

+1

@ Reb.Cabin:あなたのデモでは、非constバージョンのoperator []を呼び出す試みは一度もありません。このような機会があるたびに、代わりに 'this-> elems [i]'を使用します。 'this-> elems'は普通の生ポインタです。その演算子 '[]'は、オーバーロードされたインデクサーではなく、通常のビルトイン*インデクサーです。オーバーロードされた非constバージョンの 'operator []'を呼び出す場合は、代入の左側で 'this *> elems [i]'ではなく '(* this)[i]'を使用する必要があります。 – AnT

+0

私は参照してください。私はctorと非constインデクサを使う良い例を書き直しました。役立つ、明確なコメント。 http://coliru.stacked-crooked.com/a/3a2e3960c1e77d78 –

関連する問題