Для возвращения результата из функции применяется оператор return. Этот оператор имеет две формы:
return выражение; return;
Первая форма оператора return применяется для возвращения результата из функции. Если функция имеет в качестве возвращаемого типа любой тип, отличный от void, то такая функция обязятельно должна возвратить некоторое значение с помощью оператора return. Причем возвращаемое значение должно соответствовать возвращаемому типу функции, либо допускать неявное преобразование в этот тип.
Единственная функция, которая возвращает некоторое значение, и где можно не использовать оператор return - это функция main.
Например, мы хотим написать программу, которая бы вычисляла сумму чисел. Определим функцию, которая возвращает сумму чисел:
#include <iostream> int sum(int, int); int main() { int result = sum(10, 6); // 16 std::cout << result << std::endl; std::cout << sum(10, 7) << std::endl; // 17 std::cout << sum(10, 8) << std::endl; // 18 } int sum(int n, int m) { int res = n + m; return res; }
Здесь функция sum, которая вычисляет сумму чисел, принимает два значения типа int
и возвращает значение типа int
, поэтому прототип функции выглядит следующим образом
int sum(int, int);
И в этом случае в функции sum необходимо использовать оператор return, после которого идет возвращаемое значение:
int res = n + m; return res;
В данном случае возвращается значение переменной res
. Хотя это могло бы быть сложное выражение, которое возвращало число int, например:
int sum(int n, int m) { return n + m; }
Так как функция sum возвращает значение, то ее результат можно присвоить какой-нибудь переменной или константе:
int result = sum(10, 6); // 16 std::cout << result << std::endl;
Либо напрямую использовать результат функции sum, как число, например, при выводе на консоль:
std::cout << sum(10, 7) << std::endl; // 17
Рассмотрим еще один пример:
#include <iostream> int calculate(int, int, char); int main() { std::cout << calculate(10, 6, '+') << std::endl; // 16 std::cout << calculate(10, 6, '-') << std::endl; // 4 std::cout << calculate(10, 6, '*') << std::endl; // 60 std::cout << calculate(10, 6, '/') << std::endl; // 0 } int calculate(int n, int m, char op) { switch(op) { case '+': return n + m; case '-': return n - m; case '*': return n * m; default: return 0; } }
Здесь определена функция calculate
, которая также принимает два числа и символ - знак операции. В конструкции switch
в зависимости от знака операции с помощью оператора
return возвращается результат определенной операции
Другая форма оператора return не принимает после себя никаких значений и может использоваться в тех функциях, которые не возвращают никакого значения, то есть имеют в качестве возвращаемого типа void. Эта форма может быть полезна, если нам надо выйти из функции до ее завершения.
Например, функция принимает имя и возраст пользователя и выводит их на консоль:
#include <iostream> #include <string> void print(std::string, unsigned); int main() { print("Tom", 38); // Name: Tom Age: 38 print("Bob", 2500); // Incorrect age } void print(std::string name, unsigned age) { // если запредельный возраст if(age > 120) { std::cout << "Incorrect age" << std::endl; return; // выходим из функции } std::cout << "Name: " << name << "\tAge: " << age << std::endl; }
Здесь в функции print проверяем переданный возраст. И если он представляет недопустимое значение, то с помощью оператора return осуществляем выход из функции.
Компилятор С++ может автоматически выводить тип возвращаемого значения, если вместо возвращаемого типу используется оператор auto:
#include <iostream> // автоматически выводится возвращаемый тип auto sum(int a, int b) { return a + b; } int main() { std::cout << sum(3, 6) << std::endl; // 9 }
Здесь тип результата в функции sum выводится автоматически. Поскольку возвращется сумма a + b
, результат которой будет представлять тип int
, соответственно
компилятор выведет, что функция возвращает тип int. Стоит отметить, что функция sum определена до того, как она вызывается в функции main.
В данном случае нет большого смысла использовать оператор auto вместо int
. Обычно auto применяется,
если название возвращаемого типа довольно большое и сложное, что позволит сократить код.