Вывести или вернуть?
Начинающие часто путают return и std::cout, потому что оба как будто выдают значение наружу. Но делают они совершенно разные вещи:
std::coutтолько показывает значение вам, в выводе. Программа не может работать с тем, что было выведено.returnотдаёт значение программе, которая может сохранить его в переменной, вычислять с ним или вывести.
Посмотрите, что происходит, когда функция выводит результат вместо того, чтобы вернуть его, а программа затем хочет с ним вычислять:
#include <iostream>
void printSum(int a, int b) {
std::cout << a + b << std::endl;
}
int main() {
int result = printSum(2, 3);
std::cout << result * 2 << std::endl;
return 0;
}Программа не компилируется:
main.cpp:8:9: error: cannot initialize a variable of type 'int' with an rvalue of type 'void'
8 | int result = printSum(2, 3);
| ^ ~~~~~~~~~~~~~~
1 error generated.В сообщении об ошибке сказано, что переменную типа int нельзя заполнить значением типа void. Функция printSum — void, поэтому она не возвращает ничего, что можно было бы сохранить. Она только выводит число 5. printSum(2, 3) * 2 заканчивается так же, только с ошибкой invalid operands to binary expression ('void' and 'int'): вычислять с «ничем» нельзя.
Исправить можно, заменив void на int и вернув значение вместо вывода: return a + b;.
Бывает и наоборот: функция возвращает значение, но никто его не использует. Если написать в main только add(2, 3);, программа ничего не выведет. Функция вернула 5, но программа не сохранила и не вывела это значение, поэтому оно пропало. Если хотите его увидеть, выведите его: std::cout << add(2, 3) << std::endl;.
Так когда функция должна выводить, а когда возвращать? Функция, которая что-то вычисляет, должна возвращать результат. Код, который её вызывает, сам решает, что с ним делать: вывести, сохранить или вычислять дальше. Выводить внутри функции стоит только тогда, когда вывод — это вся её работа, как у sayHello() или printArea().
Можно возвращать и текст. Функция, которая готовит текст с числом, может вернуть его как std::string, а программа выведет его там, где захочет. Но присоединить число к тексту через + нельзя. Сначала превратите его в текст функцией std::to_string():
#include <iostream>
#include <string>
std::string formatPrice(int price) {
return std::to_string(price) + " EUR";
}
int main() {
std::string text = formatPrice(120);
std::cout << "Цена: " << text << std::endl;
std::cout << "Со скидкой: " << formatPrice(120 - 20) << std::endl;
return 0;
}Эта программа выводит:
Цена: 120 EUR
Со скидкой: 100 EURstd::to_string(120) возвращает текст "120", а + присоединяет к нему " EUR". Если написать просто return price + " EUR";, программа скомпилируется, но работать не будет: она выведет бессмыслицу или остановится с ошибкой, потому что C++ не соединяет число и текст в кавычках через +. И остерегайтесь дробных чисел: std::to_string(2.5) возвращает "2.500000", с шестью знаками после запятой.
Задание
- 1
Пицца стоит 9, напиток — 3. Функция
orderPriceдолжна вычислять цену заказа, но она только выводит цену, поэтому программа не компилируется. Исправьте функцию так, чтобы она возвращала цену, а не выводила её. Тогда программа выведетИтого: 63. - 2
Под функцией
orderPriceнапишите функциюformatPriceс параметромpriceтипаint, которая возвращает цену как текст с валютой, то есть какstd::string. Для63она возвращает"63 EUR". Превратите число в текст функциейstd::to_string(). - 3
Используйте её в последней строке, которую выводит
main: вместоfamily + friendsвыведитеformatPrice(family + friends). Программа выведетИтого: 63 EUR.