Параметры и аргументы
Наши функции до сих пор каждый раз делают одно и то же. Но чтобы вычислить площадь любого прямоугольника, функции нужно знать его ширину и высоту. Значения функция получает через параметры:
#include <iostream>
#include <string>
void introduce(std::string name) {
std::cout << "Меня зовут " << name << "." << std::endl;
}
int main() {
introduce("Анна");
introduce("Тимур");
}Эта программа выводит:
Меня зовут Анна.
Меня зовут Тимур.В определении std::string name в круглых скобках — это параметр: переменная, которую функция может использовать в своём теле. Как и другие переменные, он записывается с типом данных и именем, только без точки с запятой. В вызове значение в скобках, "Анна", — это аргумент. Когда вы вызываете функцию, аргумент сохраняется в параметре, а затем выполняется тело. При первом вызове name равно "Анна", при втором — "Тимур".
Эти два слова легко перепутать, поэтому запомните: параметр — это переменная в определении, аргумент — значение в вызове.
У функции может быть несколько параметров, через запятую. У каждого параметра свой тип данных, даже если типы одинаковые: int a, int b, а не int a, b. Аргументы попадают в параметры по порядку: первый аргумент — в первый параметр, второй — во второй и так далее:
#include <iostream>
#include <string>
void introduce(std::string name, int age) {
std::cout << "Имя: " << name << ", возраст: " << age << std::endl;
}
int main() {
introduce("Анна", 21);
introduce("Тимур", 17);
}Эта программа выводит:
Имя: Анна, возраст: 21
Имя: Тимур, возраст: 17C++ проверяет, что аргументы соответствуют параметрам. Для каждого параметра нужен свой аргумент. Если в этой программе написать только introduce("Анна");, она не скомпилируется:
main.cpp:9:5: error: no matching function for call to 'introduce'
9 | introduce("Анна");
| ^~~~~~~~~
main.cpp:4:6: note: candidate function not viable: requires 2 arguments, but 1 was provided
4 | void introduce(std::string name, int age) {
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.В первой строке ошибки сказано, что компилятор не нашёл функцию introduce, которую можно вызвать таким образом. Строка с note объясняет почему: функции нужны 2 аргумента, а передан только 1.
Похожая ошибка возникает, если поменять аргументы местами. Вызов introduce(21, "Анна") поместил бы число в name, тип которого std::string, поэтому в примечании под ошибкой написано no known conversion from 'int' to 'std::string' (число нельзя превратить в текст). Но когда у двух параметров один и тот же тип, компилятор не заметит перестановки, и функция просто будет работать с перепутанными значениями. Поэтому всегда проверяйте порядок аргументов.
Теперь мы можем решить задачу из начала урока: одна функция, которая выводит площадь любого прямоугольника.
Задание
- 1
Над
mainсоздайте функциюprintAreaс двумя параметрами типаint:widthиheight. В её теле выведитеwidth * height. - 2
В
mainвызовите её с аргументами5и6. Программа выведет30. - 3
Вызовите
printAreaещё два раза, для двух других прямоугольников из начала урока: с аргументами10и5, а затем1и5. Тогда программа выведет30,50и5, как и длинная программа в начале, но теперь на каждый прямоугольник уходит одна строка.