Читайте также: |
|
Перегрузка функций дает нам возможность использовать одно и то же имя для различных функций, и в каждом случае компилятор должен будет выбрать для работы корректную версию функции. Для этого компилятору нужны ясные критерии принятия решения о выборе функции в конкретных обстоятельствах. Ключевым моментом, здесь, является список параметров ф-ии. Ряд функций с одинаковым именем, но отличающихся списками их параметров (т.е., с разной сигнатурой) образует множество перегруженных (или перегружаемых) функций. Поэтому, возвращаясь к нашему примеру с ф-ией max(), мы могли бы иметь перегруженные функции с такими прототипами:
int max(int array[], int len); // Prototypes forlong max(long array[], int len); // a set of overloadeddouble max(double array[], int len); // functionsКаждая из функций, совместно использующих одно имя, должна иметь уникальную сигнатуру. Заметим, что только по возвращаемому типу нельзя адекватно различить функции. Мы не можем, например, присоединить к вышеприведенным функциям функцию с таким прототипом,
double max(long array[], int len);так как она будет конфликтовать с прототипом,
long max(long array[], int len);и программа не будет компилироваться. Внешне, это кажется необоснованным, но достаточно вспомнить, как пишется вызов функции, например:
long numbers[] = {1,2,3,3,6,7,11,50,40};int len = sizeof numbers/sizeof number[0];... max(numbers, len);В этом фрагменте кода компилятор не сможет “решить”, какую версию функции ему выбрать: с возвращаемым типом long или – типом double.
Итак, перегруженная функция выполняет различные действия в зависимости от типов данных, передаваемых ей в качестве аргументов.
В С++ существует несколько способов многократного использования имен функций. Поскольку основными “строительными блоками” в С++ являются классы и их объекты, то и пространства имен функций формируются на основе классов: одноименные функции из не связанных друг с другом классов могут выполнять совершенно разные задачи.
Перегрузка же функций позволяет многократно использовать имя функции в пределах одной области действия. Когда мы объявляем более одной функции с одним именем в одной и той же области действия имен, то мы перегружаем имя функции. Эта функция может быть либо обычной функцией, либо методом класса, конструктором или перегружаемой операцией (об этом - позже).
Две функции с одинаковыми именами считаются разными, если они отличаются по количеству, порядку или типу аргументов, т.е., отличаются сигнатурой. Если две функции имеют одинаковые сигнатуры и отличаются только возвращаемым типом, то оно не могут быть перегружены. Компилятор определяет, какую функцию требуется вызвать, на основе процесса, который называется разрешением (resolution – в том же смысле, что и разрешение ссылок при компоновке, т.е., принятие решения о выборе) перегружаемых имен. В результате осуществляется выбор наиболее подходящего варианта функции или выдача сообщения об ошибке при неудаче. Правила, которые компилятор при этом использует, достаточно сложны (краткое описание см. Павловская, стр.83).
Дата добавления: 2015-11-16; просмотров: 52 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Объявление указателей на функции | | | Шаблоны Функций |