参照渡し
参照渡しで分からないことがあります。
以下のコードです。一部抜粋のコードです。
> 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/01 …
No.2ベストアンサー
- 回答日時:
まず、コンストラクタにより、プライベートメンバ変数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になります。
「参照を足している」のではなく「参照した結果、変数から取り出した値を足している」と言う事に注意して下さい。
No.1
- 回答日時:
参照を式の中で使うと適宜右辺値に変換されます. その文で, 参照にせずに
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をつけて代入禁止にすることで参照のアクセスを制限し不要に書き換えらないように定数扱いにしている、という意味に受け取りました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストボックスのvalueとtext...
-
値を返さないコード パス
-
PL/SQLでのTO_DATEの時間取得に...
-
マクロで奇数と偶数の値を2か所...
-
レガシーASPの、携帯ブラウザか...
-
VB.NETでアクティブなformを知...
-
AccessVBA 帳票フォームの非連...
-
C言語では0は・・・
-
コンボボックスの幅の変更について
-
エディットボックスの数値を他...
-
変数に代入してある数値を表示...
-
VB.NETのスクロールバーコント...
-
C#の質問です
-
DataTableに対するLINQについて
-
VB初心者。小数点以下の表示で...
-
VB.NETでコンボボックスの1行目...
-
ユーザーフォームのテキストボ...
-
不定値の出力について
-
DateLastModifiedのフォーマット
-
【ASP.NET】 DataTextFieldの値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストボックスのvalueとtext...
-
VB.NETでコンボボックスの1行目...
-
値を返さないコード パス
-
Excel VBA 複数選択したリスト...
-
PL/SQLでのTO_DATEの時間取得に...
-
マクロ 特定のセル値のみクリ...
-
VB初心者。小数点以下の表示で...
-
Excel VBAのリストボックスの値...
-
変数名の取得
-
VB.NETでアクティブなformを知...
-
マクロで奇数と偶数の値を2か所...
-
Powershellのparamについて
-
ISDBNULLをスルーしてDBNULLが...
-
DataTableに対するLINQについて
-
Excel vba ユーザーフォームテ...
-
C#の質問です
-
ユーザーフォームのテキストボ...
-
VBA ドロップダウンリストを残...
-
シーケンサで最小値を保持する
-
[VBA]選択範囲の下から上に処理...
おすすめ情報