Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Что такое перегрузка функций?

Указатели на функции | Использование шаблона функции | Шаблоны функций |


Читайте также:
  1. Quot; Боль поставила ее в тупик. Еще никогда ранее, Николь не думала, что такое возможно.
  2. XIП. ЧТО ТАКОЕ "ЦЕННОСТЬ ДЕНЕГ"?
  3. ВИРУС — ЧТО ЭТО ТАКОЕ?
  4. Глава 1 Что такое поведение?
  5. Глава 1. Что такое франчайзинг
  6. Глава 2 ЧТО ЭТО, СОБСТВЕННО, ТАКОЕ — СУККУБ?
  7. Глава 2. Что такое психология? ................

Перегрузка функций дает нам возможность использовать одно и то же имя для различных функций, и в каждом случае компилятор должен будет выбрать для работы корректную версию функции. Для этого компилятору нужны ясные критерии принятия решения о выборе функции в конкретных обстоятельствах. Ключевым моментом, здесь, является список параметров ф-ии. Ряд функций с одинаковым именем, но отличающихся списками их параметров (т.е., с разной сигнатурой) образует множество перегруженных (или перегружаемых) функций. Поэтому, возвращаясь к нашему примеру с ф-ией 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 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Объявление указателей на функции| Шаблоны Функций

mybiblioteka.su - 2015-2024 год. (0.008 сек.)