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

ОГЛАВЛЕНИЕ

 

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