Байланысты: Бьерн Страуструп. Язык программирования С . М Бином, 2011
4.6.4 Возвращаемое значение Если функция не описана как void, она должна возвращать значение. Например:
int f() { } // ошибка
void g() { } // нормально
Возвращаемое значение указывается в операторе return в теле функции. Например:
int fac(int n) { return (n>1) ? n*fac(n-1) : 1; }
В теле функции может быть несколько операторов return:
int fac(int n)
{
if (n > 1)
return
n*fac(n-1);
else
return
1;
}
Подобно передаче параметров, операция возвращения значения функции эквивалентна
инициализации. Считается, что оператор return инициализирует переменную, имеющую тип
возвращаемого значения. Тип выражения в операторе return сверяется с типом функции, и
производятся все стандартные и пользовательские преобразования типа. Например:
double f()
{
//
...
return 1; // неявно преобразуется в double(1)
}
При каждом вызове функции создается новая копия ее формальных параметров и автоматических
переменных. Занятая ими память после выхода из функции будет снова использоваться, поэтому
неразумно возвращать указатель на локальную переменную. Содержимое памяти, на которую настроен
такой указатель, может измениться непредсказуемым образом:
int* f()
{
int local = 1;
//
...
return &local; //
ошибка
}
Эта ошибка не столь типична, как сходная ошибка, когда тип функции - ссылка:
int& f()
{
int local = 1;
//
...
Бьерн Страуструп.
Язык программирования С++
110
return local; //
ошибка
}
К счастью, транслятор предупреждает о том, что возвращается ссылка на локальную переменную. Вот
другой пример:
int& f() { return 1; } //
ошибка