Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 (6).doc
Скачиваний:
45
Добавлен:
12.05.2015
Размер:
1.67 Mб
Скачать

Перевантаження функцій

Перевантаження функцій (у С++) – це механізм, який дозволяє визначати декілька різних варіантів функцій з одним і тим же ім'ям, але різними прототипами. При виклику такої функції компілятор «здогадується», яку із функцій треба викликати по типу її параметрів.

Наприклад, визначимо суму цілих та дійсних чисел, застосувавши перевантажені функції add_values():

int x_int, y_int;

float x_float, y_float;

// ========= визначення суми дійсних чисел ===============

float add_values(float x1,float y1)

{ return x1+y1;

}

// ========= визначення суми цілих чисел ==================

int add_values(int x1, int y1)

{ return x1+y1;

}

// ==================== головна функція =====================

int main()

{ cout<<"enter float arg:"; cin>>x_float>>y_float;

cout<<"s="<<add_values(x_float, y_float)<<endl;

cout<<"enter integer arg:"; cin>>x_int>>y_int;

cout<<"s="<<add_values(x_int, y_int)<<endl;

system("pause");

}

Коли транслятор зустріне в програмі виклики add_values(x_float, y_float) і add_values(x_int, y_int), він за типом використовуваних параметрів підбере і викличе відповідний варіант функції. Результати роботи наведеної вище програми:

Перевантажені функції можуть відрізнятися не тільки типами параметрів, але й їх кількістю та тілами функцій. Наприклад,

// ========= визначення суми двох цілих чисел ==================

int add_values(int a, int b)

{  return (a + b);

}

// ========= визначення суми трьох цілих чисел ==================

int add_values(int a, int b, int c)

{  return (a + b + c);

}

// ==================== головна функція =====================

int main()

{ cout<<"20 + 81 = "<<add_values(20, 81)<<endl;

   cout<<"10 + 21 + 75 = "<<add_values(10, 21, 75) << endl;

}

При пошуку серед перевантажених функцій підходящої, компілятор використовує не її прототип, а сигнатуру1. Тому сигнатури перевантажених функцій повинні бути різними.

Слід зазначити, що С++ не вимагає точної відповідності сигнатури при виклику сигнатурі однієї із наявних функцій. Якщо точно відповідної перевантаженої функції немає, компілятор в змозі підібрати з набору функцій найбільш підходящу. Правила, за якими він визначає відповідну функцію, не складні, але їх вивчення не є темою даної дисципліни. Можна тільки сказати, що найбільше компілятор любить точний збіг сигнатур, потім намагається підібрати сигнатури з найбільш близькими і достатніми за розміром типами (наприклад, float у виклику може відповідати типу double в сигнатурі, але не навпаки), а деякі варіанти (наприклад, заміну char на char*) взагалі не розглядає.

Іноді при визначенні підходящої перевантаженої функції може виникнути конфлікт імен. Наприклад, якщо, маючи в розпорядженні функції для визначення більшого із двох чисел max(int, int) і max(double, double), здійснити виклик виду

int i = max (2.5, 1);

компілятор потрапить в скрутне становище, оскільки точна сигнатура виклику - max (double, int), а для неї однаково підходять обидві, наявні в наборі, функції (в обох - точний збіг типу одного з параметрів, і сумісний тип іншого параметра). В результаті буде виведене повідомлення про помилку.

У даній ситуації слід зробити одну з сигнатур більш підходячою за допомогою явного приведення типу прямо при виклику:

int i = max (2.5, double (1));

і після такої підказки компілятор легко відшукає потрібну функцію.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]