Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


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




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

Перевантаження функції (у С++) – створення декількох варіантів функції з однаковими назвами але різними прототипами.

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

// Приклад перевантаження функцій

#include<iostream>

#include<math.h>

using namespace std;

int arg_int;

float arg_float;

// ========= визначення квадрата дійсного числа ===============

float sqr(float x)

{ return x*x;

}

// ========= визначення квадрата цілого числа ==================

int sqr(int x)

{ return x*x;

}

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

int main()

{ cout<<"enter float arg for sqr():"; cin>>arg_float;

cout<<"sqr("<<arg_float<<")="<<sqr(arg_float)<<endl;

cout<<"enter integer arg for sqr():"; cin>>arg_int;

cout<<"sqr("<<arg_int<<")="<<sqr(arg_int)<<endl;

system("pause");

}

Коли транслятор зустріне в програмі виклики sqr(arg_float) і sqr(arg_int), він за типом використовуваних параметрів підбере і викличе відповідний варіант функції.

Результати роботи наведеної вище програми:

 

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

// ========= визначення квадрата дійсного числа ===============

float sqr(float x)

{ return pow(x,2);

}

// ========= визначення квадрата цілого числа ==================

int sqr(int x)

{ return x*x;

}

При пошуку серед перевантажених функцій підходящої компілятор використовує не її прототип, а її сигнатуру[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));

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

 

 


Поделиться:

Дата добавления: 2015-08-05; просмотров: 84; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.008 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты