Язык программирования C++ |
Функции
Имена функций
В языке Си++ допустимо иметь несколько функций с одним и тем же именем (перегрузка имен функций), потому что функции различаются не только по именам, но и по типам аргументов. Если в дополнение к определенной выше функции sum мы определим еще одну функцию с тем же именем
double sum(double a, double b, double c) { double result; result = a + b + c; return result; }
это будет считаться новой функцией. Иногда говорят, что у этих функций разные подписи. В следующем фрагменте программы в первый раз будет вызвана первая функция, а во второй раз – вторая:
int x, y, z, ires; double p,q,s, dres; . . . // вызвать первое определение функции sum ires = sum(x,y,z); // вызвать второе определение функции sum dres = sum(p,q,s);
При первом вызове функции sum все фактические аргументы имеют тип int. Поэтому вызывается первая функция. Во втором вызове все аргументы имеют тип double, соответственно, вызывается вторая функция.
Важен не только тип аргументов, но и их количество. Можно определить функцию sum, суммирующую четыре аргумента:
int sum(int x1, int x2, int x3, int x4) { return x1 + x2 + x3 + x4; }
Отметим, что при определении функций имеют значение тип и количество аргументов, но не тип возвращаемого значения. Попытка определения двух функций с одним и тем же именем, одними и теми же аргументами, но разными возвращаемыми значениями, приведет к ошибке компиляции:
int foo(int x); double foo(int x); // ошибка – двукратное определение имени
Необязательные аргументы функций
При объявлении функций в языке Си++ имеется возможность задать значения аргументов по умолчанию. Первый случай применения этой возможности языка – сокращение записи. Если функция вызывается с одним и тем же значением аргумента в 99% случаев, и это значение достаточно очевидно, можно задать его по умолчанию. Предположим, функция expnt возводит число в произвольную целую положительную степень. Чаще всего она используется для возведения в квадрат. Ее объявление можно записать так:
double expnt (double x, unsigned int e = 2);
double expnt (double x, unsigned int e = 2) { double result = 1; for (int i = 0; i < e; i++) result *= x; return result; } int main() { double y = expnt(3.14); double x = expnt(2.9, 5); return 1; }
Использовать аргументы по умолчанию удобно при изменении функции. Если при изменении программы нужно добавить новый аргумент, то для того чтобы не изменять все вызовы этой функции, можно новый аргумент объявить со значением по умолчанию. В таком случае старые вызовы будут использовать значение по умолчанию, а новые – значения, указанные при вызове.
Необязательных аргументов может быть несколько. Если указан один необязательный аргумент, то либо он должен быть последним в прототипе, либо все аргументы после него должны также иметь значение по умолчанию.
Если для функции задан необязательный аргумент, то фактически задано несколько подписей этой функции. Например, попытка определения двух функций
double expnt (double x, unsigned int e = 2); double expnt (double x);
приведет к ошибке компиляции – неоднозначности определения функции. Это происходит потому, что вызов
double x = expnt(4.1);