Возвращаемое значение
Если функция не описана как 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; // ... return local; // ошибка }
К счастью, транслятор предупреждает о том, что возвращается ссылка на локальную переменную. Вот другой пример:
int& f() { return 1; } // ошибка