Параметры функции

Последнее обновление: 08.03.2023

Через параметры в функцию можно передать различные значения. Параметры перечисляются после имени функции через запятую в скобках:

(тип_параметра1 имя_параметра1, тип_параметра2 имя_параметра2, ... тип_параметраN имя_параметраN)

Для каждого параметра указывается его тип и имя.

Например, определим и вызовем функцию, которая выводит на консоль имя и возраст человека:

#include <iostream>
 
void print(std::string name, unsigned age)
{
    std::cout << "Name: " << name << "\tAge: " << age << std::endl;
}
 
int main()
{
    print("Tom", 38);    // Name: Tom    Age: 38
}

При запуске программы мы получим следующий консольный вывод:

Name: Tom    Age: 38

Функция print() принимает два параметра и выводит на консоль их значения. Первый параметр называется name и представляет тип std::string. А второй параметр называется age и представляет тип unsigned int. И при вызове функции для этих параметров необходимо передать значения

print("Tom", 38);

Значения, передаваемые параметрам функции при ее вызове, называются аргументами. В данном случае в качестве аргументов передаются строковый и целочисленный литералы. При этом аргументы передаются по позиции, то есть первый аргумент (строка "Tom") передается первому параметру (параметру name), второй аргумент (число 38) - второму параметру (параметру age) и так далее.

При этом аргументы должны соответствовать параметрам по типу или допускать неявно преобразование в тип параметра. Так, в примере выше параметру name передается строковый литерал, который автоматически преобразуется в тип std::string.

Подобным образом можно передавать в параметрам не только литералы, но и, например, значения переменных и констант:

#include <iostream>
 
void print(std::string name, unsigned age)
{
    std::cout << "Name: " << name << "\tAge: " << age << std::endl;
}
 
int main()
{
    const std::string userName {"Bob"};
    unsigned userAge {42};
    print(userName, userAge);    // Name: Bob    Age: 42 
}

При вызове функции здесь параметр name получит значение константы userName, а параметр age - значение переменной userAge.

При использовании прототипа функции прототип после имени функции в скобках должен содержать типы параметров:

#include <iostream>
 
void print(std::string, unsigned);  // прототип функции print
 
int main()
{
    print("Sam", 28);    // Name: Sam    Age: 28
}

void print(std::string name, unsigned age)
{
    std::cout << "Name: " << name << "\tAge: " << age << std::endl;
}

Опционально в прототипе можно указывать имена параметров:

void print(std::string name, unsigned age);  // прототип

Аргументы по умолчанию

Функция может принимать аргументы по умолчанию, то есть некоторые значения, которые функция использует, если при вызове для параметров явным образом не передается значение:

#include <iostream>

void print(std::string name, unsigned age = 18)
{
    std::cout << "Name: " << name << "\tAge: " << age << std::endl;
}
 
int main()
{
    print("Sam");       // Name: Sam    Age: 18
    print("Tom", 22);   // Name: Tom    Age: 22
}

Для установки значения по умолчанию параметру присваивается это значение unsigned age = 18. И если для второго параметра не будет передано значение, то он будет использовать значение по умолчанию. Консольный вывод программы:

Name: Sam       Age: 18
Name: Tom       Age: 22

При объявлении прототипа подобной функции он тоже может содержать значение по умолчанию для параметра. И в этом случае мы можем не определять в функции значение по умолчанию для параметра - оно будет браться из прототипа:

#include <iostream>
 
void print(std::string, unsigned = 18);  // прототип
 
int main()
{
    print("Sam");       // Name: Sam    Age: 18
    print("Tom", 23);   // Name: Tom    Age: 23
}

void print(std::string name, unsigned age)
{
    std::cout << "Name: " << name << "\tAge: " << age << std::endl;
}

При определении необязательных параметров стоит учитывать, что они должны идти после обязательных. Например, назначим параметру name тоже значение по умолчанию:

#include <iostream>
 
void print(std::string = "Undefined", unsigned = 18);  // прототип
 
int main()
{
    print();            // Name: Undefined  Age: 18
    print("Sam");       // Name: Sam    Age: 18
    print("Tom", 23);   // Name: Tom    Age: 23
}

void print(std::string name, unsigned age)
{
    std::cout << "Name: " << name << "\tAge: " << age << std::endl;
}

Поскольку здесь параметр name определен как необязательный, то следующий за ним параметр age тоже должен иметь значение по умолчанию.

Автоматическое выведение типа параметров

Стоит отметить, что начиная со стандарта C++20 можно вместо конкретного типа для параметров указывать ключевое слово auto. Тогда тип параметров будет выводиться автоматически на этапе компиляции на основе передаваемых в функцию аргументов:

#include <iostream>

void sum(auto, auto);   // прототип функции sum

int main()
{
    const int n1{3};
    const int n2{4};
    sum(n1, n2);  // 3 + 4 = 7

    const double d1{3.3};
    const double d2{4.4};
    sum(d1, d2);;  // 3.3 + 4.4 = 7.7
}

void sum(auto a, auto b)
{
    auto result = a + b;
    std::cout << a << " + " << b << " = " << result << std::endl;
}

В данном случае функция sum вычисляет сумму двух значений. Поскольку мы можем передать числа разных типов, то, чтобы не зависеть от конкретного типа, для параметров вместо типа можно указать ключевое слово auto.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850