Практический курс по 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
Если же вызов
прописать в виде:
то первый
параметр изменит свое значение на 10, а остальные два останутся без изменений:
10
Hi!
-5.43
Соответственно,
можно прописать еще два таких вызова:
show_data(10, "Hello!");
show_data(10, "Hello!", 3.1415);
Обратите
внимание, что типы передаваемых значений должны соответствовать типам
параметров в функции. Например, при следующем вызове компилятор выдаст
сообщение об ошибке:
так как строка
не может быть приведена к целочисленному типу. Поэтому, если необходимо
изменить значение второго параметра, то при вызове функции необходимо, как
минимум, указать два аргумента:
и никак иначе.
В объявлениях
функций мы можем комбинировать обычные параметры с теми, что принимают
начальные значения. Делается это, например, следующим образом:
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