2016-08-30 5 views
0

私は、コードを書いていると私は参照&についての質問があります。この場合C++リファレンス&およびメモリ

class A{ 
    private: 
      int num; 
    public: 
      void set(const int& a){num = a;} 
      void foo(){ 
        int a = 4; 
        set(a); 
      } 
      void print(){ 
        cout << num << endl; 
      } 

}; 
int main(){ 
    A a; 
    a.foo(); 
    a.print(); 
    return 0; 
} 

は、変数afoo()の終わりに破棄されます。 setを参照すると、aのアドレスとnumが更新されます。したがって、このコードは間違っています(numは削除されたメモリを指します)?またはsetは、(アドレスではない)のnumをnumに設定しますか?

私はanumのアドレスのcoutでコードを編集して、彼らが異なっているので、私はaのnum個のコピーと思います。コードを実行すると、すべて動作するように見えますが、わかりません。

+4

'num = a;'はコピーをとりますが、特別なものはありません。 _ "numは削除されたメモリを指します" _ numはメモリを指しません。これはプレーンなクラスメンバ変数です。 –

+0

アドレスのコピーではなく、アドレスのコピー? – linofex

+0

_ "そのアドレスのコピーではなく、アドレスのコピー?" –

答えて

2

コードnum = aにはaのコピーが含まれているため、あなたのコードは無効ではありません。さらに、set()は、オブジェクトのメモリが返される前に呼び出されるため、誰もがコピーを持ち、無効なものは何も起こりません。また、クラスのインスタンスが持続する間にnumが続きますので、削除されたメモリについて心配しないでください。

+0

アドレスの値ではなく、値をコピーしますか? – linofex

+1

@linofex住所はどこにコピーされているのですか? –

+0

いいえ、アドレスはコピーされません。ポインタではありません。 2つのオブジェクトが同じアドレスを参照する例は、あるクラスにnewで割り当てられたポインタメンバーがあり、コピーの作成/割り当てが定義されていない場合です。 –

関連する問題