2015-09-09 5 views
3

Вот я беру пример перегрузки оператора инкремента:Является ли это «локальной» переменной?

class Digit 
{ 
    int m_digit; 

    public: 
     Digit (int value) //constructor 
      { 
      m_digit = value; 
      } 

     Digit& operator++(); 

     int ret_dig(){return m_digit;} 
}; 

Digit& Digit::operator++() 
{ 
    if (m_digit == 9) 
     m_digit = 0; 

    else ++m_digit; 
    return *this; 
} 

int main() 
{ 
    Digit my_dig (5); 
    ++my_dig; 
return 0; 
} 

Мне сказали, что локальные переменные не могут быть возвращены. Разве это не локальная переменная? Вот что я думаю:

Указатель типа Digit прикреплен к функции-члену (перегруженная функция оператора). Когда компилятор видит строку ++ my_dig, то есть экземпляр класса Digit, он вызывает функцию-член. Адрес экземпляра my_dig передается как аргумент функции, и есть скрытый «const Digit *» с именем «this», чтобы поймать аргумент. «this» разыменовывается (неявно) для доступа к m_digit, который является переменной-членом класса Digit. Все инкремент или обертывание выполняется внутри функции, и ссылка на разыменованное «это» затем возвращается вызывающему. Да, это точка моего смущения. Если «this» является локальной переменной типа const Digit *, не следует ли содержать мусор при возврате, потому что «это» выходит за пределы области, где заканчивается блок haaa?

+0

Вы можете вернуть локальную переменную. Существует очень мало, чтобы остановить вас от этого. Конечным результатом может быть не то, что вы ожидали или хотели, но вы можете это сделать. – user4581301

+0

Объем переменной указателя не влияет на время жизни объекта, на который он указывает. – molbdnilo

ответ

5

this - неявный параметр для всех функций-членов, который указывает на сам объект, который имеет строго более длительный срок службы, чем метод. Сам параметр является локальной переменной, но объект, который он указывает на существование вне метода.

В этом случае объект создается в первой строке вашей функции main, а затем продолжается до тех пор, пока не выйдет метод main. Таким образом, объект безопасно жив во время звонка до operator++!

+0

«это» параметр, не так ли? Все параметры являются локальными для функции, но вы говорите, что «это» не является локальным, можете ли вы уточнить :-) – user5241471

+0

Да, 'this' является неявным параметром для всех функций-членов. Но он указывает на сам объект, который имеет строго больший срок службы, чем функция. – Buddy

+0

И разыменование «это» отвлечет объект. Таким образом, ссылка на объект снова отправляется обратно после увеличения копии переменной-члена, созданной для my_dig (в данном случае), правильно? – user5241471

2

this - локальная переменная, но она инициализируется &my_dig, когда она входит в метод. Значение &my_dig имеет тот же срок службы, что и my_dig, который заканчивается в конце основного блока. Поэтому, пока this выходит за пределы области действия, значение this по-прежнему действует.

+0

Посмотрите на путаницу здесь. У этого вопроса есть два ответа. Одно высказывание «это» не является местным, а другое говорит, что «это» является локальным. Довольно запутанный :-) – user5241471

+0

это местный, * это не местный. Я считаю, что это различие. –

+0

Извините, я печатаю на iPad, у которого нет обратных тиков –

2

*this - объект, а не локальная переменная. Любые временные объекты, которые компилятор считает необходимыми для выделения, такие как те, которые необходимы для завершения выражения, имеют срок службы до конца выражения.

Это становится интересным для объектов, которые имеют деструктор, поскольку деструктор запускается не тогда, когда отдельные части выражения завершены, но когда все выражение завершено, поэтому переменная *this выдержит достаточно долго, чтобы завершить то, что необходимо.

Посмотрите this question для более глубокого обсуждения

+0

Спасибо, что помогло :-) – user5241471

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

  • Нет связанных вопросов^_^