- •2.1 Елементи концепції ооп .. 20
- •1.1 Коментарі.
- •1.2 Прототипи функцій.
- •1.3 Операція розширення області видимості.
- •1.4 Оголошення в операторах.
- •1.5 Перегрузка функцій.
- •1.6 Значення формальних параметрів по замовчуванню.
- •1.7 Посилання та вказівники.
- •1.8 Специфікатор inline
- •1.9 Операції new та delete .
- •1.10 Вказівник на void.
- •1.11 Зв’язування із збереженням типів
- •1.12 Про структури та об’єднання.
- •2.1 Елементи концепції ооп.
- •2.3 Опис протоколу класу.
- •2.4 Передача повідомлень об’єктам.
- •3 Функції-члени.
- •3.1 Функції-члени в межах та за межами формального опису класу.
- •3.2 Про вказівник this.
- •3.3 Перевантаження функцій-членів. Параметри по замовчуванню.
- •4. Конструктори та деструктори.
- •4.1 Поняття про конструктори.
- •4.2 Деструктори.
- •4.3 Досягнення високої ефективності. Конструктор копіювання.
- •5 Глобальні та локальні об’єкти.
- •6 Статична пам’ять та класи.
- •7. Наслідування
- •7.1 Синтаксична реалізація наслідування
- •7.2 Правила доступу до полів даних
- •7.3 Конструктори та деструктори в похідних класах
- •7.4 Використання заміщуючих функцій-членів.
- •7.5 Похідні класи та вказівники.
- •7.6 Ієрархія типів
- •7.7 Множинне наслідування
- •8 Вiртуальнi функцiї та класи
- •8.1 Віртуальні функції.
- •8.2 Чисті віртуальні функції. Абстрактні класи.
- •8.3 Віртуальні деструктори.
- •8.4 Посилання як засіб для реалізації поліморфізму
- •8.5 Технічна реалізація механізму віртуальних функцій.
- •8.6 Віртуальні базові класи
- •8.6.1 Ієрархії класів та наслідування
- •8.6.2 Віртуальні базові класи
- •8.6.3 Виклик конструкторів та віртуальні базові класи.
- •9 Друзі
- •9.1 Дружні класи.
- •9.2 Дружні функції.
- •10 Перевантаження операторiв.
- •10.1 Перевантаження операторів. Загальний підхід.
- •10.2 Перетворення типів.
- •10.3 Перевантаження деяких операторів.
- •10.3.1 Оператор індексування масиву.
- •10.3.2 Перевантаження оператора виклику функції.
- •10.3.3 Оператор доступу до члена класу.
- •10.3.4 Перевантаження операторів інкремента та декремента.
- •10.3.5 Перевантаження операторів управління пам’яттю (new,delete).
- •10.3.6 Перевантаження оператора присвоювання.
- •11.1 Функціональні шаблони
- •11.1.1 Визначення та використання шаблонів функцiй.
- •11.1.2 Перевантаження шаблонiв функцiї.
- •11.1.3 Cпецiалiзованi функцiї шаблона.
- •11.2 Шаблони класів.
- •11.2.1 Визначення шаблонів класу
- •11.2.2 Константи та типи як параметри шаблону
- •11.2.3 Використання шаблонних класів
- •11.2.4 Спецiалiзацiя шаблонiв класу.
- •11.3 Шаблони та конфiгурацiя компiлятора.
- •11.3.1 Шаблони Smart.
- •11.3.2 Шаблони Global I External.
- •12.2 Переадресація вводу-виводу
- •12.3 Розширення потоків для типів кориcтувача
- •12.4 Операції роботи з потоком як дружні
- •12.5 Форматований ввід-вивід
- •12.5.1 Ширина поля
- •12.5.2 Заповнюючий символ
- •12.5.3 Число цифр дійсних чисел
- •12.5.4 Прапорці форматування
- •12.5.5 Маніпулятори
- •12.6 Стан потоку
- •12.7 Файловий ввід-вивід
- •12.7.1 Конструктори файлових потокiв
- •12.7.2 Вiдкриття файлу
- •12.8 Неформатований ввід-вивід
- •12.9 Деякі функції вводу-виводу
- •12.10 Форматування в пам’яті
- •13 Управління виключеннями
- •13.1 Виключення та стек
- •13.2.1 Синтаксис основних конструкцій
- •13.2.1.1 Використання try та сatch
- •13.2.1.2 Використання throw
- •13.2.2 Тип виключення та конструктор копії
- •13.2.3 Пошук відповідного типу виключення
- •13.2.4 Використання terminate() та некеровані виключення
- •13.2.5 Робота з специфікаціями виключень
- •13.2.6 Робота з непередбаченими виключеннями
- •13.2.7 Робота з конструкторами та виключеннями
- •13.2.8 Динамічні об’єкти
- •13.2.9 Передача значень з конструктора та деструктора
- •13.2.10 Робота з ієрархіями виключень
- •13.2.11 Робота з специфічними класами виключень
- •13.3 Структурне управління виключеннями
- •13.3.1 Використання кадрованого управління виключеннями
- •13.3.1.1 Синтаксис
- •13.3.1.2 Про функцію RaiseException()
- •13.3.1.3 Фільтруючий вираз
- •13.3.1.4 Перехоплення виключення процесора
- •13.3.2 Використання завершуючих обробників виключень
9.2 Дружні функції.
Крім дружніх класів в С++ допускаються і дружні функції. Синтаксично для оголошення дружньої до класу функції необхідно в протоколі класу помістити оголошення виду:
friend <тип результату><ім’я функції>(сигнатура);
Як правило, таке оголошення розміщують зразу після відкриваючої фігурної дужки в протоколі класу. Оголошення функції другом класу відкриває їй доступ до закритих та захищених даних екземпляра класу. Дружні функції можуть бути як звичайними функціями С++ так і членами класу. Як привило, дружня функція оголошується з параметрами-класами, з якими вона “дружить”. Розглянемо приклад:
# include<iostream.h>
class Two;
class One{
friend void Show(One &c1,Two &c2);
private:
char *s1;
public:
One()[s1=“testing”;
};
class Two{
friend void Show (One &c1,Two &c2);
private:
char *s2;
public:
Two(){s2=“one, two,three”;
};
main()
{ One c1;
Two c2;
Show(c1,c2);
return 0;
}
void Show(One &c1,Two &c2)
{
cout<<c1.s1<<c2.s2<<“\n”;
}
В цьому прикладі оголошується дружня функція до класів One та Two. Це дає їй можливість мати доступ до закритих полів s1та s2. Відмітимо, що з очевидних міркувань тут необхідним є неповне оголошення класу Two.
Як вже відмічалось вище, дружня функція також може бути членом класу.
Синтаксично оголошення її реалізується з використанням операції розширення області видимості:
friend <тип результату>< ім’я класу>::<ім’я функції-члена>(сигнатура);
Розглянемо приклад:
# include<iostream.h>
class One;
class Two{
friend void Show (One &c1,Two &c2);
private:
char *s2;
public:
Two(){s2=“one, two,three”;
void Show(One &c1);
};
class One {
friend void Two::Show(One &c1);
private:
char *s1;
public:
One(){s1=“testing”;}
};
main()
{ One c1;
Two c2;
c2.Show(c1);
return 0;
}
void Two::Show(One &c1)
{
cout<<c1.s1<<“\n”;
}
Бачимо, що порядок оголошень класів змінився (порівняно з попереднім
прикладом), оскільки клас, в якому міститься прототип функції-члена, повинен оголошуватись до класу, який визначає функцію-член дружньою.
Контрольні запитання
1. Які властивості мають дружні класи ?
2. Де може міститись оголошення дружнього класу ?
3. Чи є дружніми похідні від дружніх класів ?
4. Як синтаксично оголошуються дружні функції ?
5. В чому полягає специфіка дружніх функцій ?
Завдання 9:
1. Протестувати приклад з класом Pal. Розглянути випадок взаємно-дружніх класів.
2. Описати клас , дружній до класу Літак, який може змінювати значення окремих полів даних цього класу.(Наприклад, збільшувати кількість палива та боєприпасів). Очевидно, що такий клас може служити моделлю заправки.
3. Вважаючи, що заправка може відбуватись в повітрі, визначити клас Літак_Заправник , похідний від класу Літак.