Вот я беру пример перегрузки оператора инкремента:Является ли это «локальной» переменной?
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?
Вы можете вернуть локальную переменную. Существует очень мало, чтобы остановить вас от этого. Конечным результатом может быть не то, что вы ожидали или хотели, но вы можете это сделать. – user4581301
Объем переменной указателя не влияет на время жизни объекта, на который он указывает. – molbdnilo