- ベストアンサー
参照渡しで分からないことがあります。
参照渡し 参照渡しで分からないことがあります。 以下のコードです。一部抜粋のコードです。 > class CSample > { > public: > CSample(){ m_num = 123; } // コンストラクタ > int& get(){ return m_num; } // メンバ変数を参照戻し > private: > int m_num; > }; > ~~~~~~~ >int& alias1 = get(); >alias1 *= 2; >int& alias2 = get() + alias1; // このようにブロックの途中で宣言できる ~~~~~~~ このコードの中の >int& alias2 = get() + alias1; が分からないところです。 参照をalias2に設定しているところだと思われますがget()の参照戻しのアドレスと alias1の参照のアドレスと2つの参照を設定しているのが分かりません、この2つは同じアドレスをさしているのでこのサンプルでは支障はないように思えますが。 この場合は、式右辺のget()+alias1の2つの参照を足しているのが分からないので教えてください。 なおこのコードが掲載されているサイトは以下です。 http://www.geocities.jp/ky_webid/cpp/language/015.html
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず、コンストラクタにより、プライベートメンバ変数m_numは123になります。 >int& alias1 = get(); get()による参照戻しで、alias1はプライベートメンバ変数m_numを参照するようになります。 つまり、alias1の値を変更すると、プライベートメンバ変数m_numの値も変更されるようになります。 次に、初期化リストget()の「値」が評価され、alias1の値が初期化されます。 get()の「値」はプライベートメンバ変数m_numの「値」ですから、結局、プライベートメンバ変数m_numの値がプライベートメンバ変数m_numに代入されます(つまり、何もしません) >alias1 *= 2; alias1を2倍するとプライベートメンバ変数m_numも2倍され246になります。 >int& alias2 = get() + alias1; // このようにブロックの途中で宣言できる まず、get()による参照戻しで、alias2はプライベートメンバ変数m_numを参照ようになります。 つまり、alias2の値を変更すると、プライベートメンバ変数m_numの値も変更されるようになります。 次に、初期化リストget() + alias1の「値」が評価され、alias2の値が初期化されます。 get()が返す「値」はプライベートメンバ変数m_numの値です。alias1の値もプライベートメンバ変数m_numの値です。従ってget() + alias1の「値」はプライベートメンバ変数m_numの「値」 + プライベートメンバ変数m_numの「値」になります。 「参照」ではなく「参照した結果の変数の中身の値同士」を足し算しています。 足された結果は、492です。 計算結果492が「初期化する値」になるので、alias2は492で初期化されます。初期化としてalias2に492を代入するとプライベートメンバ変数m_numも同じ値の492になります。 「参照を足している」のではなく「参照した結果、変数から取り出した値を足している」と言う事に注意して下さい。
その他の回答 (2)
- titokani
- ベストアンサー率19% (341/1726)
ところで、このソース、コンパイルしてみましたか?
- Tacosan
- ベストアンサー率23% (3656/15482)
参照を式の中で使うと適宜右辺値に変換されます. その文で, 参照にせずに int val = get() + alias1; なら意味は理解できますか? ただ, alias2 を int& で定義するのもいかがなものかと思う. const int & くらいにはすべきじゃないかなぁ.
補足
>int val = get() + alias1; >なら意味は理解できますか? 理解できます。get()と2倍されたalias1=246+123*2が、int型変数valに代入されます。 しかし、左辺が参照では >int& alias2 = get() + alias1; 右辺値の246+246を参照型変数alias2には代入できないと思います。 なぜなら参照の初期化にはアドレスを設定するはずだから、ここの動作が分かりません。 自分としてはここが肝心な箇所だったので教えてくれると助かります。なので補足要求しました。 なお、 >const int & くらいにはすべきじゃないかなぁ.」 はconstをつけて代入禁止にすることで参照のアクセスを制限し不要に書き換えらないように定数扱いにしている、という意味に受け取りました。
お礼
ご回答ありがとうございました。とてもよく分かりました。 疑問は解決しましたので締め切らせていただきます。