Язык программирования 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; }  // ошибка



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