Перегрузка функций.
Каждый раз, когда мы изучаем, новую тему, нам важно узнать, в чем заключается применение наших знаний на практике. Цель перегрузки функций состоит в том, чтобы несколько функций обладая одним именем, по-разному выполнялись и возвращали разные значения при обращении к ним с разными по типам и количеству фактическими параметрами. Например, может потребоваться функция, возвращающая максимальное из значений элементов одномерного массива, передаваемого ей в качестве параметра. Массивы, используемые как фактические параметры, могут содержать элементы разных типов, но пользователь функции не должен беспокоиться о типе результата. Функция всегда должна возвращать значение того же типа, что и тип массива - фактического параметра. Для реализации перегрузки функций необходимо для каждого имени определить, сколько разных функций связано с ним, т.е. сколько вариантов вызовов допустимы при обращении к ним. Предположим, что функция выбора максимального значения элемента из массива должна работать для массивов типа int, long, float, double. В этом случае придется написать четыре разных варианта функции с одним и тем же именем. В нашем примере эта задача решена следующим образом:
1. В программе мы показали независимость перегруженных функций от типа возвращаемого значения. Две функции, обрабатывающие целые массивы (int, long), возвращают значение одного типа long. Две функции, обрабатывающие вещественные массивы (double, float), обе возвращают значение типа double. 2. Распознавание перегруженных функций при вызове выполняется по их параметрам. Перегруженные функции должны иметь одинаковые имена, но спецификации их параметров должны различаться по количеству и (или) по типам, и (или) по расположению. ВНИМАНИЕ!!! При использовании перегруженных функций нужно с осторожностью задавать начальные значения их параметров. Предположим, мы следующим образом определили перегруженную функцию умножения разного количества параметров:
Каждое из следующих обращений к функции multy() будет однозначно идентифицировано и правильно обработано:
Однако, добавление в программу функции с начальными значениями параметров:
навсегда запутает любой компилятор при попытках обработать, например, такой вызов:
что приведет к ошибке на этапе компиляции. Будьте внимательны!!! Следующий раздел урока расскажет вам об альтернативном решении, позволяющем создать универсальную функцию.
Шаблоны функций. Шаблоны функций в языке С позволяют создать общее определение функции, применяемой для различных типов данных. В прошлой теме, чтобы использовать одну и ту же функцию с различными типами данных мы создавали отдельную перегруженную версию этой функции для каждого типа. Например:
Теперь, используя шаблон мы сможем реализовать единственное описание, обрабатывающее значения любого типа:
Теперь - обсудим то, что у нас получилось. 1. Идентификатор T является параметром типа. Именно он определяет тип параметра, передаваемого в момент вызова функции. 2. Допустим, программа вызывает функцию Abs и передает ей значения типа int:
3. В данном случае, компилятор автоматически создает версию функции, где вместо T подставляется тип int. 4. Теперь функция будет выглядеть так:
5. Следует отметить, что компилятор создаст версии функции для любого вызова, с любым типом данных. Такой процесс носит название - создание экземпляра шаблона функции. Или, если склоняться к более специфической терминологии - инстанционирование шаблона (template instantiation). ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|