Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по С++ глава 2.doc
Скачиваний:
15
Добавлен:
05.11.2018
Размер:
249.86 Кб
Скачать

2.3.9. Перегруженные функции

В программе на языке C++, можно определить несколько функций с одним и тем же именем, если функции с идентичными именами отличаются по числу и типам параметров. Например, объявление двух различных вариантов функции Abs, один для вычисления абсолютной величины типа int, а другой - для значения типа double, например:

int Abs (int N)

{

return N < 0 ? -N : N;

}

double Abs {double N)

{

return N < 0.0 ? -N : N;

}

Если такие функции, которые названы идентично, объявлены внутри одной области видимости, то их называют перегруженными функциями. Компилятор автоматически вызывает соответствующий вариант перегруженной функции на основании типа параметра или параметров в фактическом вызове функции, например:

int Abs (int N); // оба варианта функции Abs объявлены в

double Abs (double N); // области видимости файла

void main()

{

int I;

double D;

I = Abs(5); // вызывает 'int Abs (int N)'

D = Abs(-2.5); // вызывает 'double Abs (double N)'

// ...

}

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

  • функции имеют различное число параметров;

  • типы одного или более параметров различны.

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

int Abs (int N)

{

return N < 0 ? -N : N;

}

double Abs(int N) // ОШИБКА: перегруженная функция, которая

// отличается типом возвращаемого значения

{

return (double N) (N < 0.0 ? -N : N) ;

}

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

int Abs (int N);

int Abs (const int N); //ОШИБКА: список параметров слишком похож

В этом случае параметры типа int и const int будут инициализированы с использованием одинакового множества типов данных. При передаче любого из этих типов после вызова функции компилятор не сможет определить, какая именно перегруженная функция вызывается. Аналогично, нельзя определить перегруженные функции следующим образом:

int Abs (int N);

int Abs (int &N); // ОШИБКА: список параметров слишком похож

так как в обе функции будет передана переменная типа int.

Если передать в перегруженную функцию аргумент, который не совпадает с типом аргумента, определенного для любого варианта функции, то компилятор попытается преобразовать аргумент к одному из определенных типов. Будет выполнено либо стандартное преобразование (например, int в long), либо преобразование, определенное пользователем. Если преобразовать типы невозможно, то компилятор сгенерирует ошибку. В противном случае, т.е. когда преобразование возможно, будет вызвана функция, спецификация аргументов которой наиболее близка полученной. Когда функции подобны в равной степени, генерируется ошибка (вызов функции неоднозначен).

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

void Display (char *Buffer);:

void Display (char *Buffer, int Lenght = 32);

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

Display ("Hello"); //ОШИБКА: неоднозначный вызов!

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