
- •Тема 5 Функции
- •5.1 Синтаксис функций
- •5.2 Типизированные и нетипизированные функции. Оператор return
- •5.3 Автоматические и статические локальные переменные, глобальные переменные
- •5.4 Способы передачи параметров функциям
- •5.5 Передача массивов функциям
- •5.6 Функции специального назначения
- •5.6.1 Встроенные функции (inline-функции)
- •5.6.2 Рекурсивные функции
- •5.7.1 Аргументы функций по умолчанию
- •5.7.2 Перегрузка функций
- •5.7.3 Перегрузка функций и неопределенность
5.7.1 Аргументы функций по умолчанию
Чтобы упростить вызов функции, при её объявлении можно указать значения параметров по умолчанию. Эти параметры должны быть последними в списке и могут опускаться при вызове функции. В качестве значений параметров по умолчанию могут использоваться константы, глобальные переменные и выражения. Значения по умолчанию задаются аналогично тому, как выполняется инициализация переменных, например:
void Func( int A, int B = 90, int C = 0); // объявление функции
//--------------------------------------------------------------------------------------------------
void main()
{
// различные варианты вызова функции
Func ( 10, 20, 30 ); // A = 10 B = 20 C = 30
Func ( 10, 20 ); // A = 10 B = 20 C = 0
Func ( 10); // A = 10 B = 90 C = 0
Func ( 10, , 30); // неправильно!
}
Аргументы по умолчанию позволяют писать более простой код. Для того чтобы охватить множество ситуаций, часто функция содержит больше параметров, чем это необходимо при ее наиболее типичном использовании. Используя аргументы по умолчанию, можно указать только те аргументы, которые отличаются от значений по умолчанию в каждой конкретной ситуации.
При создании функции, имеющей аргументы по умолчанию, следует соблюдать следующие правила:
1) значения по умолчанию должны быть указаны только один раз, причем тогда, когда функция первый раз объявляется в файле, иначе компилятор выдаст сообщение об ошибке;
2) все параметры по умолчанию должны располагаются правее параметров, которые не имеют значений по умолчанию.
5.7.2 Перегрузка функций
Очень часто алгоритмы обработки данных одинаковы, отличаются лишь типы обрабатываемых данных. Название (или имя) каждой функции указывает, что она делает и показывает тип выводимых данных. В C++ разрешается использовать одно и то же название (имя) функции, чтобы объявлять и определять различные версии функции. Эта возможность названа перегрузкой функции. C++ требует, чтобы соблюдались следующие правила при объявлении перегруженных функций:
1) каждая версия перегруженной функции должна иметь отличную от других сигнатуру функции. Сигнатура функции определена числом параметров и их типами данных. Сигнатура функции не включает тип возвращаемой величины, потому что C++ разрешает игнорировать тип возвращаемой величины в операторе. Сигнатура, однако, включает последовательность параметров, которые имеют различные типы данных;
2) если функция имеет параметры со значениями по умолчанию, компилятор не включает эти параметры как часть сигнатуры функции.
Рассмотрим пример функции, выполняющей пузырьковую сортировку одномерного массива. При этом алгоритм сортировки совершенно одинаков, отличаются только типы массивов.
void Sort (int Mas[ ], int N); // целочисленный массив
void Sort (double Mas[ ], int N); // вещественный массив
void Sort (char Mas[ ], int N); // символьный массив
//---------------------------------------------------------------------------------
void main()
{
int A[Nmax] = { 25, 18, 42, 76, 38};
double B[Nmax] = { 1.5, 2.7, 5.4, 3.9, 7.2};
char C[Nmax] = { ‘z’, ‘d’, ‘w’, ‘a’, ‘d};
int N;
Sort( A, N ); // или Input( &Mas[0], N ); передаётся адрес 1-го элемента
}
Версия перегруженной функции определяется компилятором по типу аргументов, использованных при вызове перегруженной функции. В данном примере будет вызвана первая версия функции Sort() для сортировки целочисленного массива.