Програмування С, С++теорія та практика (частина 2)
2.5.5 Перевантаження функцій
Згадаємо, що в Сі кожна функція повинна мати унікальне ім’я. У Сі++ є можливість визначати функції з однаковими іменами, але з унікальними типами аргументів. Одне й те саме перевантажене (оуегїоайїпд) ім’я може описувати одні й ті ж дії, що можуть проводитися над даними різних типів. Компілятор відрізнятиме одну функцію від іншої згідно вказаного прототипу, що містить число, порядок слідування та тип параметрів. Так, функції носять ім’я перевантажених, оскільки їх імена однакові, а робота, яку вони виконують, відмінна. Імена функцій можуть бути перевантажені лише в межах однієї й тієї ж області видимості. У більш ранніх версіях Сі++ на початку області видимості, в якій виконувалось перевантаження, обов’язковим було ключове слово оуєгіоагі. Починаючи з версії 2.0 необхідність у цьому відпала, хоча здебільшого для сумісності версій ключове слово залишилось, але використання його зовсім небажане.
Отже, перевантажені функції повинні відрізнятися одна від іншої принаймні за одним з нижче наведених пунктів: мати різну кількість аргументів;
мати відмінність хоча б в одному з типів аргументів.
Приклад. Визначимо перевантажені функції 5Иомг(), що друкують власні аргументи. Зазначимо, що вони знаходяться в одному файлі (мають однакову область видимості - файл).
VОій 8Ьом(1опд Vа1ие)
{
ргіп'Ь£("%1й"^а1ие) ;
}
VОій 8Ьом(сЬаг *з'Ьгіпд)
{
ри'Ьз (з'Ьгіпд) ;
}
VОій 8Ьом(йоиЬ1е Vа1ие)
{ ргіп££ ("%1£" ^а1ие) ; }
VОій. таіп (){
8Ьом("\п Друк 1");
8Ьом(9998);
8Ьом(1.223);
}
Коли компілятор зустрічає у функції таіп() різні звертання до функції 8ком(), тобто виклики функцій з різним списком параметрів, він їх аналізує та відшукує функцію, що підходить для використання. Слід зазначити, що повністю уся додаткова робота виконується ще під час компіляції, що вельми важливо: під час виконання програми ніяких додаткових процесів не відбудеться і звертання до перевантаженої функції нічим не відрізнятиметься від аналогічного процесу звертання до будь-якої функції.
Процес пошуку функції, що найбільше підходить для використання полягає в пошуку „найкращої” відповідності формальних і фактичних параметрів. Це досягається шляхом перевірки набору критеріїв в наступному порядку:
• Точна відповідність типів; тобто повна відповідність, що досягається тривіальним перетворенням типів (наприклад, ім’я масиву і покажчик, ім’я функції і покажчик на функцію, тип Іуре і соті Іуре).
• Відповідність, що досягається „підтягуванням” типів (наприклад, скаг в іпі, зкогі в іпі,/Іоаі в іїоиЬІе тощо).
• Відповідність, що досягається шляхом стандартних перетворень (наприклад, іпі в іїоиЬІе, іїоиЬІе в іпі, іїоиЬІе в Іопд іїоиЬІе тощо).
• Відповідність, що досягається перетвореннями, визначеними користувачем.
• Відповідність за рахунок змінного числа аргументів (...) в оголошенні функції.
Зауваження. Функції не розрізнятимуться, якщо мають лише різний тип значення, що повертається. Наприклад, не можуть вважатися перевантаженими наступні функції: іп£ 8Ьом(іп'Ь *а) ; сЬаг *8Ьом(іп'Ь *а) ;
Недостатнім є застосування функцій з аргументами типу посилання: іп£ 8Ьом(іп'Ь а) ; іп£ 8Ьом(іп'Ь &Ь) ;
Із зрозумілих причин неможливим є перевантаження функцій, в яких відсутній опис аргументів. Так, представлення іпіргос(іпі а, ...);
та іпґ ргос(іпґ а, скаг Ь); не визначить, яка функція буде активізованою, якщо виклик організувати як ргос(1,2). Не можуть бути перевантаженими функції, якщо їх параметри відрізняються лише застосуванням модифікаторів їх аргументів - соті, уоїаґіїв. Компілятор не розрізнятиме описи уоій /ипк(соті іпґ а) та уоій /ипк(уоІаґіїв іпґ а). Крім того, неможливим є перевантажування усіх функцій із стандартної бібліотеки Зґапйагй С ЬіЬгагу.
Компілятор Сі++ здійснює декорування імен перевантажених функцій, що дозволяє без ускладнень забезпечити використання механізму перевантаження. Для власного внутрішнього представлення він додає до імені декілька символів, що ототожнюють тип та порядок слідування параметрів, що сприймаються функцією. Як приклад, розглянемо декілька варіантів декорування:
Vоігі їипс(іпї і); ^ @їипс$яі
іпі їипс(іпї і); ^ @їипс$яі
Vоігі їипс(сНаг і); ^ @їипс$яс
Vоігі їипс(сНаг *р;) ^ @їипс$ярс
З перших рядків добре видно, чому неможливим є перевантаження функцій, що відрізняються лише типом значення, яке повертається. Адже цей тип не включається до закодованих імен.
Приклад.
#іпс1игіе<з'Ьгі±о. Ь>
#іпс1ийе<сопіо.Ь>
Vоій. ргіп'Ь (іп£ а)
{
ргіп'ЬЕС^оігі. ргіп'Міп'Ь а)\п") ;
}
Vоій. ргіп^(сопз^ сЬаг* а)
{
ргіп'ЬЕС^оігі ргіп^(сопз^ сЬаг* а)\п");
}
Vоій. ргіп'Ь (йоиЬ1е а)
{
ргіп'ЬЕС^оігі. ргіп'Ь(гіоиЬ1е а)\п") ;
}
Vоій. ргіп'Ь (1опд а)
{
ргіп'ЬЕС^оігі ргіп'Ь(1опд а)\п") ;}
Vоій. ргіп^(сЬаг а)
{
ргіп'ЬЕС^оігі. ргіп^(сЬаг а)\п") ;
|
ргіп£(с); |
/* |
точна |
відповідність |
- ргіп^(сЬаг а) |
*/ |
|
ргіп£(і) ; |
/* |
точна |
відповідність |
- ргіп£(іп£ а) |
*/ |
|
ргіп£(з); |
/* |
"підтягування" типу |
- ргіп£(іп£ а) |
*/ |
|
|
ргіп£(£) ; і |
/* |
"підтягування" типу |
- ргіп£(йоиЬ1е |
а) |
|
|
ргіп£('а') ; |
/* |
точна |
відповідність |
- ргіп^(сЬаг а) |
*/ |
|
ргіп£(49) ; |
/* |
точна |
відповідність |
- ргіп£(іп£ а) |
*/ |
|
ргіп£(0); |
/* |
точна |
відповідність |
- ргіп£(іп£ а) |
*/ |
|
ргіп£("а") ; |
/* |
точна |
відповідність |
- ргіп^(сопз^ |
|
|
VОій. £п (сЬаг { |
|
с,іп£ і,зЬог^ з,£1оа^ £) |
|
/ |
|
* |
сЬаг* а) */
}
VОій. таіп ()
{
£п(1,2,3,4
}
Отримаємо такі результати :
VОій. ргіп^(сЬаг а)
VОій. ргіп£ (іп£ а)
VОій. ргіп£ (іп£ а)
VОій. ргіп£ (йоиЬ1е а)
VОій. ргіп^(сЬаг а)
VОій. ргіп£ (іп£ а)
VОій. ргіп£ (іп£ а)
VОій. ргіп^(сопз^ сЬаг* а)
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
Схожі підручники
- Соціологія Навчально-методичний посібник для студентів всіх напрямків (частина 1)
- Стан НПС та основні напрями природоохоронної політики Чехії управлінські, організаційні, економічні та юридичні аспекти
- Управління проектами (частина 2)
- Самостiйна робота з курсу - Системи промислових технологій в галузях економіки
- Методичні вказівки до виконання практичного заняття на тему «Післяоптимізаційний аналіз розв’язку економічних задач »
- Банки як агенти валютного контролю
