参照の初期化?~int& alias2 = get() + alias1;分かりません

このQ&Aのポイント
  • int& alias2 = get() + alias1;という式は、C++のプログラムで参照の初期化を行っている部分です。
  • 具体的には、get()という関数から戻ってきた参照型の値に、変数alias1の値を足して、それを参照型の変数alias2に代入しています。
  • つまり、alias2はget()の戻り値とalias1の値を足した結果を参照していると言えます。
回答を見る
  • ベストアンサー

参照の初期化?~int& alias2 = get() + alias1;分かりません

<c++です>こんばんは、宜しくお願い致します。 > class CSample > { > public: > CSample(){ m_num = 123; } // コンストラクタ > int& get(){ return m_num; } // メンバ変数を参照戻し > private: > int m_num; > }; >(1) int& alias1 = get(); >(2) alias1 *= 2; >(3) int& alias2 = get() + alias1; // このようにブロックの途中で宣 >言できるとできます。 あるサイトで↑のようなサンプルプログラムがあるのですが(1)は分かるのですが(参照の初期化をしている)、(3)の動作が分かりません。参照の初期化みたいですが、参照型の戻り値get()に変数alias1を足しているのですがそれを別の参照alias2の初期化みたいになっており理解できません。教えてください。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

あれ? これってできたっけ? コンパイルエラーになりそうな気がする. 一応いっておくと, この例でも const int &alias2 = get() + alias1; は正当です. 右辺の値を計算して (メモリ上の) どこかに保存し, そこへの参照として alias2 を定義するだけだから.

w_kiyo123
質問者

お礼

ご回答ありがとうございました。とてもよく分かりました。

関連するQ&A

  • 参照渡しで分からないことがあります。

    参照渡し 参照渡しで分からないことがあります。 以下のコードです。一部抜粋のコードです。 > 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

  • 派生クラスのメンバを基底クラスの参照に代入(C++

    文末のコードのように、 基底クラスで、派生クラスのメンバの参照を持つのはまずいでしょうか。 (classではなくstructにしているのは質問上でのpublic:の省略のためだけです) 初期化順序的には、基底クラスの参照先は、 基底クラスのコンストラクタが走る時点で初期化されていないので、 コンストラクタ内で参照に対して何かしようとすると問題になると思っています。 基底クラスのコンストラクタ内で派生クラスメンバの参照に対して何かしなければ、 参照は有効で、派生クラスのコンストラクタ実行後であれば 問題なく動くと思ってよいでしょうか。 struct A { int& m_ref; A(int& ref) : m_ref(ref) { } }; struct B : public A { int m_obj; B() : A(m_obj) { } };

  • クラスがメンバーとしてクラスを持つ時の宣言について

    自作クラスMainClassがMyClassというクラスをメンバー変数として持つ場合、宣言時に引数をいくつか持つコンストラクタを呼び出そうとすると構文エラーとなります。 class MyClass { public: MyClass(int, int); } class MainClass { private: MyClass myclass(10,10); } このような宣言はできないのでしょうか。 引数なしのコンストラクタは呼び出せているようです。

  • ヘッダーファイル内でconst変数を初期化する時にエラー

    ヘッダーファイル内でconst変数を初期化する場合、 以下のようにしているのですが、エラーが出てしまいます。 どのようにすればうまくいくのでしょうか? 環境はVisualC++.NETです。 class abc{ private:  const int x; public:  abc(){   x = 10;  } }

  • インスタンス変数の特殊な参照

    次のようなクラスを考えたときに(特に意味があるものではないですが) class A{ int a; A(){ a = 10; B b = new B(); } } class B{ int b; B(){ b = 20; C c = new C(); } } class C{ int c; C(){ c = 20; } } Cのコンストラクタの中から、Aのインスタンス変数aやBでのbの値を 参照することって出来ないのでしょうか? 変数をクラス変数にする、引数として渡す以外の方法を探しています。

  • STL vectorの初期化

    STL vectorの初期化についてなんですが 以下のようなクラスのprivateなメンバ変数としてvectorを定義し それをメソッド内のループ処理にて初期化しながら使用したいのですが 初期化の仕方が分かりません。コンストラクタを呼べば初期化されるようですが 以下のようにヘッダとソース内で2度同じような宣言をしてしまっても問題ないのでしょうか? //=== test.h === class test { private : vector<int> array; public : int fnc(); }; //=== test.c === int fnc() { for (int i = 0; i < 10; i++) { //★ここで初期化したい vector<int> array;  ←これで問題ないか? for (int j = 0; j < 10; j++) { array.push_back( md ); } } } C#などでは宣言とインスタンス生成を別に分けられたのですがC++も同様の事が出来るのでしょうか? 一応「array = new vector<int>;」といれて見たのですがエラーが出ました。

  • クラス内の初期化の簡略方法と、クラス内の巨大な配列をどうにかしたい。

    C++でクラスを書いているのですが、2つ悩んでいることがあります。 1つ目は、初期値のある巨大なテーブルをクラスの中に入れておくと、インスタンス生成ごとに巨大な参照用変数が作られるのはスマートでないと感じるのですが、何か良い方法はありますか? 2つめは、クラスで変数割り当てと同時に初期値セットを簡便に行いたいです。 class A { int info_table[100000]; void init(void){ info_table[0] = 1; // 1)実際は意味のある数値で、参照される巨大な変数 ... // 2)だらだら書くのではなくて、info_table[] = { 1, 2, 3 ... 100000};のように書きたい info_table[99999]; } public: A(){ init(); } ~A(){} };

  • C++基底クラスに戻り値の異なる関数が宣言されている場合

    こんにちは。 質問させてください。 以下のようなコードがあったとします。 class Base1 { public:   virtual int get()=0; }; class Base2 { public:   virtual float get()=0; }; class Ex : public Base1, public Base2 { public:   int get(){return 0;}   float get(){return 0.0f;} }; void main() { } このプログラムをコンパイルすると 「'Ex::get': オーバーライドする仮想関数の戻り値の型が異なり、'Base1::get' の covariant ではありません。」 というエラーが出てしまいます。 関数の名前と引数が同じで戻り値だけが異なる場合はエラーが出るのはわかるのですが、基底クラスのBase1、Base2は変更不可能だとするとどのように回避すればいいのでしょうか? よろしくお願いします。 /*   WindowsXP Professional SP3   VisualStudio2005 AcademicEdition */

  • ArrayListの初期値の設定の仕方(VB.NET)

    VB.NET2005についての質問です。 ArrayList型の変数の初期値に、プロパティの戻り値を設定することは可能でしょうか。 (つまり、下記の(a)(b)の二行を一行にまとめたい、と考えています) どうぞよろしくお願い致します。 Public Class form1   Dim hoge As New ArrayList  'a)初期値としてClass1.P_hogeを設定したい   hoge = Class1.P_hoge    'b)消したい End Class Public Class Class1   Private Shared _hoge As New ArrayList  'すでに値が格納されているものとする   Public Shared Property P_hoge() As ArrayList      Get    Return _hoge    End Get   End Property End Class

  • C++の文法を教えてください。

    class Car { int a; short c; double b; public: Car():a(10),b(1.0),c(3) {}//<-この表現 }; 上記のコンストラクタで変数を初期化できるようですが、これはどのような仕組みでこのようなことができるのでしょうか? 1)この場合のコロン:にはどのような意味があるのでしょうか? 2)()のオーバーロードというものをつかっているのでしょうか? C++のどのような機能でこの初期化が行われているかを説明しなければならず、お教えねがえますでしょうか。 よろしくお願いいたします。

専門家に質問してみよう