2016-05-07 8 views
1

は、参照型としてメンバを持つクラス定義される第2オブジェクトの作成後に変更された理由:最初のオブジェクト部材は

int value1 = 1, value2 = 2; 
NodeBase first(value1); 
NodeBase second(value2); 

:このクラスタイプの2つのオブジェクトを作成しそして

struct NodeBase{ 
int& val; 
NodeBase(int input = 0) :val{ input }{} 
}; 

firstが作成され、そのメンバーのvalは1と等しくなりました。ただし、secondを作成した後、valの値はfirstに変更されました。

+2

はこれを試してみてください。したがって、参照を評価するための未定義の動作です。 –

+1

定義済みの変数に変更され、問題は同じです。 – lightrek

+3

重要ではありませんが、参照はコンストラクタの最後で終了するfunctionパラメータにバインドされます。 –

答えて

2

参照は、コンストラクタの完了時に範囲外になる関数パラメータinputにバインドされます。これにより参照がぶら下がってしまいます。

リファレンスを外部オブジェクトを参照する代わりに、パラメータとして参照してください。

NodeBase(int& input) :val{ input }{} 

あなたが参照することなく、メンバー平野intを作り、クラスが外部変数を参照したくない場合。非const参照の場合に意味をなさないデフォルトの引数を指定しようとすると、おそらくこれはあなたがすべきことです。

0

あなたが同様に参照することにより、入力を渡す必要があります:

struct NodeBase{ 
    int& val; 
    NodeBase(int& input) :val{ input }{} 
}; 

そうでない場合は、valとすぐコンストラクタが終了したとして、もはや存在しないローカルパラメータを、参照します。したがって、未定義の動作です。

参照を保持するときに意味のないデフォルトの引数=0を指定することはできません。

0

value1inputに保存されたコピーとして渡します。次に、変数inputへの参照を保存します。 value1にはありません。だから、コンストラクタが終了すると、あなたはリファレンス・ダイです。そしてぶらぶらしたリファレンスになった。彼らはもはや生きていた値(つまり、コンストラクタのパラメータ変数)にバインドされているので参照は、ぶら下がっている

struct NodeBase{ 
    int& val; 
    NodeBase(int& input) :val{ input }{} 
}; 
関連する問題