Значения параметров функции по умолчанию

Практический курс по C/C++: https://stepik.org/course/193691

Следующей особенностью объявления функций в языке С++ является возможность определения параметров со значениями по умолчанию. Давайте, я сразу приведу простой пример такой функции:

#include <iostream>
 
using std::cout;
using std::cin;
using std::endl;
 
void show_data(int a=1, const char* str="Hi!", double b=-5.43)
{
    cout << a << endl << str << endl << b << endl;
}
 
int main()
{
    show_data();
    return 0;
}

Смотрите, функция show_data() объявлена с тремя параметрами и каждый сразу проиницализирован некоторым значением. Затем, эта функция вызывается в main() без передачи в нее каких-либо аргументов. В результате такого вызова все три параметра функции show_data() принимают предустановленные значения и в консоли отображаются следующие строчки:

1
Hi!
-5.43

Если же вызов прописать в виде:

show_data(10);

то первый параметр изменит свое значение на 10, а остальные два останутся без изменений:

10
Hi!
-5.43

Соответственно, можно прописать еще два таких вызова:

show_data(10, "Hello!");
show_data(10, "Hello!", 3.1415);

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

show_data("Hello!");

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

show_data(10, "Hello!");

и никак иначе.

В объявлениях функций мы можем комбинировать обычные параметры с теми, что принимают начальные значения. Делается это, например, следующим образом:

void show_data(const char* sep, int a=1, const char* str="Hi!", double b=-5.43)
{
    cout << sep << endl;
    cout << a << endl << str << endl << b << endl;
}

Тогда, вызывая функцию show_data() мы обязаны передать ей первый аргумент:

show_data("-----------------");

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

int length(int a=0, int b, int c=0)  // ошибка
{
    return sqrt(a*a + b*b + c*c);
}
 
double length(double a=0, double b=0, double c)  // ошибка
{
    return sqrt(a*a + b*b + c*c);
}

Обязательно вначале должны идти параметры без значений и только в конце прописывать параметры со значениями:

int length(int a, int b, int c=0)  // ok
{
    return sqrt(a*a + b*b + c*c);
}

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

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

#include <math.h>
 
double round_math(double x, int radix=0)
{
    double p = pow(10, radix);
    return round(x * p) / p;
}

Здесь второй параметр определяет точность округления: 0 – до целых; 1 – до десятых; и так далее.

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

int main()
{
    double res_1 = round_math(4.5634);  // 5
    double res_2 = round_math(4.5634, 1); // 4.6
    double res_3 = round_math(4.5634, 3); // 4.563
    cout << res_1 << "\n" << res_2 << "\n" << res_3 << endl;
    
    return 0;
}

Видите, как это удобно? И все благодаря параметру с начальным значением 0!

Практический курс по C/C++: https://stepik.org/course/193691

Видео по теме