Студопедия

КАТЕГОРИИ:


Архитектура-(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++ передбачена можливість створення декількох функцій з однаковим ім'ям. Це називається перевантаженням функцій. Переобтяжені функції повинні відрізнятися один від одного списками параметрів: або типом одного або декількох параметрів, або різною кількістю параметрів, або і тим і іншим одночасно. Розглянемо наступний приклад:

int myFunction (int, int); int myFunction (long, long); int myFunction (long);

Функція myFunction() переобтяжена з трьома різними списками параметрів. Перша і друга версії відрізняються типами параметрів, а третя - їх кількістю.

Типи повертаних значень переобтяжених функцій можуть бути однаковими або різними. Слід мати на увазі, що при створенні двох функцій з однаковим ім'ям і однаковим списком параметрів, але з різними типами повертаних значень, буде згенерована помилка компіляції.

Перевантаження функцій також називається поліморфізмом функцій. Поли (гр. poly) означає багато, морфе (гр. morphe) - форма, тобто поліморфічна функція - це функція, що відрізняється різноманіттям форм.

Під поліморфізмом функції розуміють існування в програмі декількох переобтяжених версій функції, що мають різні призначення. Змінюючи кількість або тип параметрів, можна присвоїти двом або декільком функціям одне і те ж ім'я. При цьому ніякої плутанини при виклику функцій не буде, оскільки потрібна функція визначається по збігу використовуваних параметрів. Це дозволяє створити функцію, яка зможе, наприклад, усереднювати цілочисельні значення, значення типу double або значення інших типів без необхідності створювати окремі імена для кожної функції - AverageInts(), AverageDoubles() і так далі

Припустимо, ви пишете функцію, яка подвоює будь-яке передаване нею значення. При цьому ви б хотіли мати можливість передавати їй значення типу int, long, float або double. Без перевантаження функцій вам би довелося створювати чотири різні функції:

int DoubleInt(int); long DoubleLong(long); float DoubleFloat(float); double DoubleDouble(double);

За допомогою перевантаження функцій можна використовувати наступні оголошення:

int Double(int); long Double(long); float Double(float); double Double(double);

Завдяки використанню переобтяжених функцій не треба турбуватися про виклик в програмі потрібної функції, що відповідає типу передаваних змінних. При виклику переобтяженої функції компілятор автоматично визначить, який саме варіант функції слід використовувати. Перевантаження функції показане в лістингу 5.8.

 

Лістинг 5.8. Поліморфізм функцій

1: // Лістинг 5.8. Приклад

2: // поліморфізму функцій

3:

4: #include <iostream.h>

5:

6: int Double(int);

7: long Double(long);

8: float Double(float);

9: double Double(double);

10:

11: int main()

12: {

13: int myInt = 6500;

14: long myLong = 65000;

15: float myFloat = 6.5F;

16: double myDouble = 6.5e20;

17:

18: int doubledInt;

19: long doubledLong;

20: float doubledFloat;

21: double doubledDouble;

22:

23: cout << "myInt: " << myInt << "\n";

24: cout << "myLong: " << myLong << "\n";

25: cout << "myFloat: " << myFloat << "\n";

26: cout << "myDouble: " << myDouble << "\n";

27:

28: doubledInt = Double(myInt);

29: doubledLong = Double(myLong);

30: doubledFloat = Double(myFloat);

31: doubledDouble = Double(myDouble);

32:

33: cout << "doubledInt: " << doubledInt << "\n";

34: cout << "doubledLong: " << doubledLong << "\n";

35: cout << "doubledFloat: " << doubledFloat << "\n";

36: cout << "doubledDouble: " << doubledDouble << "\n";

37:

38: return 0;

39: }

40:

41: int Double(int original)

42: {

43: cout << "In Double(int)\n";

44: return 2 * original;

45: }

46:

47: long Double(long original)

48: {

49: cout << "In Double(long)\n";

50: return 2 * original;

51: }

52:

53: float Double(float original)

54: {

55: cout << "In Double(float)\n";

56: return 2 * original;

57: }

58:

59: double Double(double original)

60: {

61: cout << "In Double(double)\n";

62: return 2 * original;

63: }

 

Результат:

myInt: 6500

myLong: 65000

myFloat: 6.5

myDouble: 6.5e+20

In Double(int)

In Double(long)

In Double(float)

In Double(double)

DoubledInt: 13000

DoubledLong 130000

DoubledFLoat: 13

DoubledDouble: 1.3e+21

 

Аналіз: Функція Double() перевантажується для прийому параметрів чотирьох типів: int, long, float і double. Прототипи функцій займають рядки 6-9, а визначення - рядки 41-63.

У тілі основної програми оголошується вісім локальних змінних. У рядках 13-16 ініціалізувалися перші чотири змінні, а в рядках 28-31 іншим чотирьом змінним привласнюються результати передачі значень перших чотирьох змінних функції Double(). Звернете увагу, що по виду виклику ці функції нічим не відрізняються один від одного. Але дивна справа: ви передаєте аргумент - і викликається потрібна функція!

Річ у тому, що компілятор визначає тип переданого аргументу, на підставі якого вибирає відповідний варіант функції Double(). А результати роботи цієї програми підтверджують очікувану черговість виклику варіантів цієї переобтяженої функції.

 




Поделиться с друзьями:


Дата добавления: 2013-12-14; Просмотров: 1123; Нарушение авторских прав?; Мы поможем в написании вашей работы!


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



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




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