Язык программирования C++ для профессионалов

       

Возвращаемое значение


Если функция не описана как 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; } // ошибка



Содержание раздела