Функции. Основные принципы структурной методологии. Принцип формальности. Принцип иерархического упорядочивания, страница 17

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

·  Перегруженные функции могут иметь параметры по умолчанию. В различных вариантах перегруженных функций может быть различное количество параметров по умолчанию. Значения одного и того же параметра в разных функциях должны совпадать.

·  Функции не могут быть перегружены, если описание их параметров отличается только модификатором const или использованием ссылки (например,  int и const int   или  int и int &).

·  Функции не могут быть перегружены, если их описание отличается только типом возвращаемых значений (например, int FUN2(int);  и  float FUN2(int);).

Заметим, что так как перегрузка – это способность иметь множество форм (а такое свойство называют полиморфизмом), то перегрузка – это специфический вид полиморфизма, о котором мы будем говорить подробно при рассмотрении ООП.

Шаблоны функций

Многие алгоритмы не зависят от типов обрабатываемых данных. Естественное желание – параметризовать алгоритм, чтобы его можно было использовать для различных типов данных. Для этого можно передавать в функцию, реализующую такой алгоритм, в качестве дополнительных параметров, информацию о типе данного (например, указатель на данные и длину элемента данных в байтах). Но это приводит к генерации дополнительного кода и снижает эффективность программы.

Можно написать также семейство перегруженных функций. Но оно также полностью не разрешает проблему (хотя бы потому, что «подключение к работе» каждого нового типа требует включения новых перегруженных функций).

В С++ есть мощное средство параметризации функций (и классов, но о них позже) – шаблоны.

Шаблоны служат для автоматизации создания функций, которые могут обрабатывать разнотипные данные, т.е. для автоматического формирования конкретных определений функций по вызовам, обнаруживаемым транслятором в теле программы. Шаблон, с одной стороны, – это модель, трафарет для создания семейства функций, и сам по себе он не вызывает генерацию компилятором программного кода. Как только компилятор встретит вызов функции, определенной в шаблоне, он сгенерирует код функции для типа аргумента, переданного в шаблон.

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

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

Шаблон семейства функций состоит из двух частей: заголовка шаблона  (template <список параметров шаблона>) и обычного определения функции (заголовок и тело функции), в котором тип возвращаемого значения и/или типы параметров обозначаются именами параметров шаблона, введенных в его заголовке. Имена параметров шаблона могут использоваться и в теле определения функции для обозначения типов локальных объектов.

Формат простейшей функции-шаблона:

template <class type>            заголовок функции

{ //тело функции

}

где вместо слова type может использоваться произвольное имя.

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

template <class A, class B, int> 

void f() {……..}