Russian Belarusian English German Japanese Ukrainian

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

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

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

Для решения этой задачи вы можете описать следующие функции:

char * ToS(char *S,int X)
{
return strcat(strcat(S," "),IntToStr(X) .c_str());
}
char * ToS(char *S, double X)
{
return strcat(strcat (S," "),FloatToStr(X) .c_str());
}
char * ToS (char *S, bool X)
{
if (X) return strcat (S," true");
else return strcat (S," false");
}

Тогда в своей программе вы можете написать, например, вызовы:

char S[128] = "Значение =";
char S1 = ToS(S,5);

или

char S[128] = "Значение =";
char S2 = ToS(S,5.3);

или

char S[128] = "Значение =";
char S3 = ToS(S,true);

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

Приведем еще один пример, в котором перегруженные функции различаются количеством параметров. Ниже описана перегрузка функции, названной Area и вычисляющей площадь круга по его радиусу R, если задан один параметр, и площадь прямоугольника по его сторонам а и b, если задано два параметра:

double Area(double R)
{
return 6.28318*R*R;
}
double Area(double a, double b)
{
return a*b;
}

Тогда операторы вида:

S1 = Area(1);
S2 = Area(1,2);

приведут в первом случае к вызову функции вычисления площади круга, а во втором к вызову функции вычисления площади прямоугольника.

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

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

Функция с пропущенными аргументами по умолчанию может оказаться вызванной аналогично другой перегруженной функции - это синтаксическая ошибка.

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

Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий


Поиск по сайту