Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

В программе на языке 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"); //ОШИБКА: неоднозначный вызов!

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

<== предыдущая лекция | следующая лекция ==>
Константы и функции | Операторы new и delete
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 305; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.