Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ob_yektno-oriyentovani_metodi_programuvannya.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
2.21 Mб
Скачать

Int b(); // функція-член

};

class t2

{

friend int t1::b(); // функція-член класу t1 має доступ до всіх прихованих полів класу t2

};

class t3

{

friend class t1; // всі функції-члени класу t1 мають доступ до всіх полів класу t3

};

Клас можна визначити за допомогою конструкції

тип_класу им’я_класу {компоненти класу};

  • тип класу – одно з службових слів class, struct, union;

  • ім’я_класу – ідентифікатор (задається користувачем);

  • компоненти класу – визначення і об’явлення даних, що належать класу функцій.

Клас: class name

{     int data; // Елемент данних    void show (int); // Функция-елемент };

21. Конструктори з параметрами в С++. Деструктори.

Необхідність у ініціаллізації ще більш часто проявляється при роботі з об'єктами. Дійсно, якщо звернутися до реальних проблем, то, фактично, для кожного створюваного вами об'єкта потрібно якогось виду ініціалізація. Для вирішення цієї проблеми в C + + є функція-конструктор (Constructor function), яка включається в опис класу. Конструктор класу визується щоразу під час створення об'єкта цього класу. Таким чином, будь-яка необхідна об'єкту ініціалізація за наявності конструктора виконується автоматично. Конструктор має те ж ім'я, що й клас, частиною якого він є, і не має що повертається значення. 

Деструктор класу викликається при видаленні об'єкта. Локальні об'єкти видаляються тоді, коли вони виходять з області видимості. Глобальні об'єкекти видаляються при завершенні програми. Адреси конструктора і деструктора отримати неможливо.

Конструктори з параметрами.Конструктору можна передавати аргументи. Для цього просто додайте необхідні параметри в оголошення і визначення конструктора. Потім за оголошенні об'єкта задайте параметри в якості аргументів. Щоб поняти, як це робиться, почнемо з короткого прикладу:

Конструктор за замовчуванням. Так називають конструктор, який дозволяє створювати екземпляри класів з неявною ініціалізацією даних. Як вже зазначалось, такий конструктор автоматично створюється для класів, в яких не визначений власний конструктор. Проте, як тільки в класі визначається хоч один конструктор, такий автоматичний конструктор перестає діяти. В разі необхідності створення екземплярів без ініціалізації, варто визначити в класі конструктор за умовчанням. Найпростіший спосіб зробити це - перевантажити конструктор, або визначити умовчання для всіх його параметрів.

Конструктор копіювання. Справа полягає в тому, що параметр типу Student передається у функцію f () за значенням, а отже, створюється, а потім знищується зі стеку. Тому і виникає зайвий виклик деструктора. Але конструктор при створенні локального екземпляру класу у стеку не викликався! Дійсно створенням екземплярів, які необхідно ініціалізувати значенням вже існуючого екземпляру займається інший конструктор -так званий конструктор копіювання. В даному прикладі був викликаний такий конструктор, створений компілятором. Він просто поелементно копіює даний екземпляр. Але це не завжди доречно, адже, можливо, необхідне виділення пам'яті для даних членів, тощо. Для явного визначення конструктора копіювання необхідно дотримуватись особливого синтаксису: <ім'я_класу> (const <ім'я_класу> & );

Параметром конструктора копіювання є стала змінна-посилання на екземпляр класу. Його призначення - коректне створення копії екземпляру. Особливо важливо це у випадку, коли членами класу є вказівники, пам'ять під які виділяється оператором new. Адже тоді по-елементне копіювання копіює вказівник (поверхневе копіювання), а не об'єкт, на який він посилається, - для цього необхідне глибоке копіювання.

22. Віртуальні функції в С++. Чисто віртуальні функції.

Віртуальна функція (virtual function) — це функція-член, оголошена в базовому класі і перевизначена в похідному. Щоб створити віртуальну функцію, слід вказати ключове слово virtual перед її оголошенням в базовому класі. Похідний клас перевизначає цю функцію, пристосовувавши її для своїх потреб. По суті, віртуальна функція реалізує принцип "один інтерфейс, декілька методів", лежачий в основі поліморфізму. Віртуальна функція в базовому класі визначає вид інтерфейсу, тобто спосіб виклику цієї функції. Кожне перевизначення віртуальної функції в похідному класі реалізує операції, властиві лише даному класу. Інакше кажучи, перевизначення віртуальної функції створює конкретний метод (specific method).

Чисто віртуальна функція (pure virtual function) – це функція, що не має визначення в базовому класі. Для оголошення чисто віртуальної функції використовується наступна синтаксична конструкція.

virtual тип імя_функції (список_параметрів) = 0;

Чисто віртуальні функції повинні перевизначатися в кожному похідному класі, інакше виникне помилка компіляції.

23. Узагальнені (шаблонні) функції і типи в С++.

Узагальнена функція визначає універсальну сукупність операцій, застосовних до різних типів даних. Тип даних, з якими працює функція, передається як параметр. Узагальнена функція оголошується за допомогою ключового слова template. Визначення шаблонної функції виглядає в такий спосіб.

template <typename T> тип_значення_що_повертається ім’я_функції(список_параметрів)

{

// Тіло функції

}

Тут параметр T задає тип даних, з яким працює функція. Цей параметр можна використовувати й усередині функції, однак при створенні конкретної версії узагальненої функції компілятор автоматично підставить замість нього фактичний тип. За правилами узагальнений тип задається за допомогою ключового слова typename, хоча замість нього можна застосовувати традиційне ключове слово class.

У наступному прикладі демонструється узагальнена функція, що знаходить найбільший серед двох об’єктів.

// Приклад шаблонної функції.

template <class T>

inline T const& max(T const& a, T const& b)

{

return a< b ? b : a;

}

Із шаблонами зв'язано декілька понять. По-перше, узагальнена функція (тобто функція, оголошена за допомогою ключового слова template) називається також шаблоном функції, або шаблонною функцією (template function). Ці терміни є синонімами. Конкретна версія узагальненої функції, створювана компілятором, називається спеціалізацією (specialization) чи згенерованою функцією (generated function). Процес генерації конкретної функції називається конкретизацією (instantiation). Іншими словами, згенерована функція є конкретним екземпляром узагальненої функції. Тип T, що указується в кутових дужках, називається параметром шаблону (або шаблонним параметром), а тип, що указується в списку параметрів (наприклад, int) — параметром виклику.

24. Перезавантаження функцій в С++.

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

Увага! Для функцій, які відрізняються типом значення, яке вони повертають, і мають однаковий набір аргументів, перевантаження у мові С++ не визначено, тобто їм надавати однакові імена не можна.

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