Бьерн Страуструп - Язык программирования С++. Главы 2-4
Страница 61. Возвращаемое значение


 

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

 
« Предыдущая статья   Следующая статья »