МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів
Контакти
Тлумачний словник Авто Автоматизація Архітектура Астрономія Аудит Біологія Будівництво Бухгалтерія Винахідництво Виробництво Військова справа Генетика Географія Геологія Господарство Держава Дім Екологія Економетрика Економіка Електроніка Журналістика та ЗМІ Зв'язок Іноземні мови Інформатика Історія Комп'ютери Креслення Кулінарія Культура Лексикологія Література Логіка Маркетинг Математика Машинобудування Медицина Менеджмент Метали і Зварювання Механіка Мистецтво Музика Населення Освіта Охорона безпеки життя Охорона Праці Педагогіка Політика Право Програмування Промисловість Психологія Радіо Регилия Соціологія Спорт Стандартизація Технології Торгівля Туризм Фізика Фізіологія Філософія Фінанси Хімія Юриспунденкция |
|
|||||||
Створення шаблону функції та його використанняТема 8. Використання шаблонів функцій та класів Контрольні запитання та завдання 1. Що таке чисто віртуальна функція? 2. Що таке абстрактний клас? Що таке поліморфний клас? 3. Чи є правильним наступний фрагмент? Якщо ні, то чому? class base { public: virtual int f (int a) = 0; //… }; class derived: public base { public: int f(int a, int b) {return a * b;} //… }; 7. Чи успадковується віртуальність? 8. Що відрізняє віртуальні функції від перевантажених функцій?
1. Створення шаблону функції та його використання 2. Оголошення шаблону класів та визначення його методів
Достатньо часто можна записати алгоритм виконання якої-небудь дії незалежно від того, якого типу дані ми обробляємо. Найпростішим прикладом буде визначення максимуму з двох величин. if (а>b) х=а; else х=b; Незалежно від того, до якого саме типу належать змінні а, b і х, якщо це один і той же тип, для якого визначена операція більше, запис буде одна і та ж. Було б природно визначити функцію max, що повертає максимум з двох своїх аргументів. Виникає питання, як описати аргументи цієї функції? Звичайно, можна визначити max для всіх відомих типів, проте, по-перше, довелося б повторювати один і той же запис багато разів, а по-друге, з додаванням нових класів додавати нові функції. Аналогічна ситуація зустрічається і з багатьма складними структурами даних. В класі, що реалізовує зв’язаний список цілих чисел, алгоритми додавання нового атрибута списку, пошуку потрібного атрибута і так далі, не залежать від того, що атрибути списку - цілі числа. Точно такі ж алгоритми потрібно буде реалізувати для списку дійсних чисел або покажчиків на клас Book. Механізм шаблонів в мові Си++ дозволяє ефективно вирішувати такі і багато подібні задачі. Ми познайомимося з двома важливими поняттями мови C++: шаблонами функцій і шаблонами класів. Шаблони дозволяють давати узагальнені, в значенні довільності типів даних, визначення функцій і класів, що використовуються. Тому їх часто називають функціями і класами, що параметризуються. Часто також використовуються терміни шаблонні функції і шаблонні класи. Шаблон функції є узагальненим визначенням функції, з якого компілятор автоматично створює представник функції для заданого користувачем типу (або типів) даних. Коли компілятор створює за шаблоном функції конкретного її представника, то говорять, що він створив породжену функцію. Синтаксис оголошення шаблона функції має наступний вигляд: template <class T1 | Т1 ідентифікатор1, class Т2 | Т2 ідентифікатор2,..., class Tn | Тn ідентифікаторn> тип ім’я_функції (список параметрів) { //тіло функції} За ключовим словом template слідують один або декілька параметрів, вкладених в кутові дужки, розділені між собою комами. Кожний параметр є: • або ключовим словом class, за яким слідує ім’я типу; • або ім’ям типа, за яким слідує ідентифікатор. Для завдання типів даних, що параметризуються, замість ключевого слова class може також використовуватися ключове слово typename. Параметри шаблона, наступні за ключовим слоbom class або typename, називають типами, що параметризуються. Вони інформують компілятор про те, що деякий тип даних використовується в шаблоні як параметр. Параметри шаблона, що складаються з імені типу і наступного за ним ідентифікатора, інформують компілятор про те, що параметром шаблона є константа вказаного типу. У зв’язку з цим такі параметри називаються нетиповими. Ви можете викликати шаблонну функцію як звичайну; ніякого спеціального синтаксису не вимагається. Запишемо алгоритм знаходження максимуму двох величин, де як параментра виступає тип цих величин. template<class T> const Т& max(const Т& а, const Т& Ь) { if (а > Ь) return а; else return b; } Цей запис ще не створив жодну функцію, це лише шаблон для конкретної функції. Тільки тоді, коли відбувається звернення до функції з аргументами конкретного типу, відбудеться генерація конкретної функції. int x, у, z; String si, s2, s3; ... // генерація функції max для класу String s1 = max(s2, s3); ... // генерація функції max для типу int x = max(у, z); Читайте також:
|
||||||||
|