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;
             // ...
             return local;   // ошибка
           }

К счастью, транслятор предупреждает о том, что возвращается ссылка на локальную переменную. Вот другой пример:

           int& f() { return 1; }  // ошибка

Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.