Возврат Значения

Из функции, которая не описана как void, можно (и должно) возвращать значение. Возвращаемое значение задается оператором 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; }

 

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

double f() { // ... return 1; // неявно преобразуется к double(1) }

 

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

int* f() { int local = 1; // ... return &local; // так не делайте }

 

Эта ошибка менее обычна, чем эквивалентная ошибка при использовании ссылок:

int& f() { int local = 1; // ... return local; // так не делайте }

 

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

int& f() { return 1;} // так не делайте