Курсовая работа: Побудова і використання класів
· узагальнені функції, або шаблони.
Перевантаження функцій та операцій можна визначити як статичний поліморфізм, тому що він підтримується на етапі компіляції. Віртуальні функції відносяться до динамічного поліморфізму, тому що він реалізується при виконанні програм.
В С++ дозволяється наявність декількох однойменних функцій, які виконують аналогічні дії над даними різних типів. Наприклад, в програмі визначені дві функції з прототипами:
intmax(int, int);
floatmax(float, float);
В процесі компіляції програми при виклику функцій max() в залежності від типу та числа аргументів буде здійснюватися завантаження необхідного екземпляра функції. Цей механізм називається перевантаженням функцій.
Одна з найважливіших властивостей поліморфізму – перевизначення стандартних функцій, при якій в залежності від типів даних у виразах викликається необхідний екземпляр операції. Перевизначення може виконуватися для наступних стандартних операцій:
+, –, *, /, =, <, >, +=, –=, *=, /=, <<, >>, <<=, >>=, ==, !=, <=, >=, ++, ––, %, &, ^, !, ~, &=, ^=, |=, |, &&, ||, %=, [], (), new, delete
Не можуть бути перевизначені операції: . , .*, ?:, ::, sizeof.
Перевизначення операції може виконуватися з допомогою визначення операторної функції наступного формату:
тип_результату operatorзнак_операції (список_параметрів)
{оператори_тіла_операторної_функції}
Тут тип_оператора визначає тип повертає мого значення при виконанні перевизначеної операції; в круглих дужках задається список типів параметрів, при наявності яких у аргументів звернення до операції до операцій з даним знаком буде виконуватися перевантаження (виклик) саме цього екземпляру операції. [2]
Один з варіантів використання поліморфізму – віртуальні функції. Якщо при використанні віртуальної функції запит здійснюється з допомогою вказівника базового класу (або посилання), то С++ вибирає правильно перевизначену функцію у відповідному похідному класі, який зв’язаний з цим об’єктом.
Іноді функція-елемент визначається в базовому класі як віртуальна, але перевизначена в похідному класі. Якщо така функція-елемент викликається через вказівник похідного класу, то використовується версія похідного класу. Це не поліморфна поведінка.
Завдяки використанню поліморфних функцій та поліморфізму виклик функції-елемента може привести до різних дій, які залежать від типу об’єкту, який викликається. [5]
Як вже було сказано, механізм керування доступом дозволяє виділяти загальнодоступні (public), захищені (protected) та власні (private) компоненти класів. Захищені компоненти доступні всередині класу та в похідних класах. Власні компоненти локалізовані в класі та недоступні ззовні. З допомогою загальнодоступних компонентів реалізується взаємодія класу з будь-якими частинами програми. Проте, є ще одна можливість розширити інтерфейс класу. Це забезпечують дружні функції. За визначенням, дружньою функцією класу є функція, яка не будучи його компонентом, має доступ до його захищених та власних компонентів. Функція не може стати другом класу «без його згоди». Для отримання прав друга функція повинна бути описана в тілі класу із специфікатором friend. Саме при наявності такого опису клас дає функції права доступу до захищених та власних компонентів.
Приклад роботи класу з дружньою функцією.
#include <conio.h>//для консольних функцій у текстовому режимі
//клас «символ у заданій позиції екрану»
classcharlocus
{
intx, y; //координати місця символу на екрані
charcc;
//прототип дружньої функції для заміни символу
friend void friend_put (charlocus*, char);
public:
charlocus (int xi, int yi, char ci)//конструктор
{