• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:演算子のオーバーロードについて)

演算子のオーバーロードについて

このQ&Aのポイント
  • 質問:[]演算子のオーバーロードでつまづきました。
  • 代入文で左辺、右辺、両方ともに[]演算子を使う場合、int &operator[](int i)のようにして、戻り値を参照型にしています。
  • main関数内で、ob1[2]=ob2[2];のようにすると、左辺(ob1)にちゃんと代入されています。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

参照というのは、参照先を設定できるのは初期化時のみです。そこがポインタとは異なるところです。 今回の場合、右辺は参照型ですが、実際に左辺に代入されるのは参照先の値になります。

tattin894
質問者

補足

まず、main関数内のob1[2]という文によってoperator[]関数が呼び出され、return a[i];で戻り値として、参照型のa[i]が返され、main関数内のob[2]がこの戻り値と置き換わり、次にob2[2]という文が解釈され、またoperator[]関数が呼び出され、参照型のa[i]に置き換わる?そしてob1[2]=ob2[2]の=が評価され、 a[i](ob1側)にa[i](ob2側)が代入される? ↑があってるとしてたら、参照型は何に初期化されているのでしょうか? 戻り値がob1[2]と置き換わる時に、↓のことをやっているのと同じことなのでしょうか? int &a[i]; a[i]=ob1[2]; 違うとおもいますが。

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> ↑があってるとしてたら、参照型は何に初期化されているのでしょうか? 参照型はa[i]に初期化されます。 C++では引数を渡したり、返却値を渡すというのは、仮引数や返却値を初期化するということになります。 > 戻り値がob1[2]と置き換わる時に、↓のことをやっているのと同じことなのでしょうか? > int &a[i]; > a[i]=ob1[2]; > 違うとおもいますが。 違います。ob1[2]=ob2[2];を擬似コードで書くと、 int& __r2 = ob2.a[2]; int& __r1 = ob1.a[2]; __r1 = __r2; という具合です。 参照では動作が見えにくいのであれば、ポインタを使って、 int* __r2 = &ob2.a[2]; int* __r1 = &ob1.a[2]; *__r1 = *__r2; と書き直せばわかっていただけるのではないかと思います。