2016-08-30 3 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; 
} 

В этом случае переменная a будет уничтожена в конце foo(). set возьмите ссылку, поэтому адрес a и обновления num. Следовательно, этот код неправильный (число указывает на удаленную память)? Или set, устанавливает число с значение (а не адрес)?

Я редактировать код с cout по адресу a и num и они разные, так что я думаю, что NUM копирует значение из a. Если я запустил код, все вроде бы работает, но я не уверен.

+4

'num = a;' берет копию, ничего особенного. _ "num указывает на удаленную память" _ no 'num' не указывает на память, это простая переменная-член класса. –

+0

Копия значения a, а не адреса, не так ли? – linofex

+0

_ «Копия значения a, а не адреса, правильно?» _ Конечно. –

ответ

2

Ваш код не является недопустимым, так как код num = a, принимает копию. Плюс, set() называется ПЕРЕД памятью объектов, поэтому все имеют копию, и ничего недействительного не происходит. Кроме того, помните, что num длится пока экземпляр класса длится, поэтому не беспокойтесь о удаленной памяти.

+0

Скопируйте значение a, а не адрес, правильно? – linofex

+1

@linofex Что дает вам идея, адрес там скопирован? –

+0

Нет, адрес не скопирован, это не указатели. Примером того, когда два объекта будут ссылаться на один и тот же адрес, является то, что класс имеет элемент указателя, назначенный новым, а построение/присвоение копирования для него не определено. –

Смежные вопросы