- •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 Використання завершуючих обробників виключень
6 Статична пам’ять та класи.
При вивченні класів пам’яті ми вже зустрічалися з класом пам’яті static. Специфікатор класу пам’яті static впливає на час життя та область дії змінної чи функції. Змінна , оголошена з специфікатором класу пам’яті static , існує в єдиному екземплярi в межах області видимості.
Клас пам’яті static може використовуватись і при оголошенні полів класу. Специфіка статичних полів полягає в тому, що вони мають одне i те ж значення у всiх об'єктах даного класу. Іншими словами , якщо описати статичне поле при заданні класу, то у всіх екземплярів цього класу значення відповідного поля завжди буде однаковим. Зміна значення статичного поля в одному з об’єктів класу приведе до зміни цього значення у всіх екземплярах класу (для всіх екземплярів класу виділяється одне і те ж саме місце в пам’яті для збереження статичного поля).
class statpol {
public:
static int i;
} a,b,c;
main()
{ a.i=1;
cout<<b.i<<“\n”;
cout<<c.i<<“\n”;
}
Для роботи з статичним полем в С++ версії 3.11 обов’язково необхідно оголошувати статичне поле за межами протоколу класу. При компіляції наведеного вище прикладу помилки не виникне, але виникне помилка на етапі лінкування програми. Щоб цієї помилки уникнути, необхідне зовнішнє оголошення виду:
int statpol::i;
Статичні поля можуть ініціалізуватись за допомогою глобальних оголошень типу:
int statpol::i=1;
Доступ до статичного поля можна здійснювати і за допомогою операції розширення області видимості, яка застосовується до імені відповідного класу:
main()
{
statpol a;
a.i=1;
statpol::i=2;
//...
}
Допускаються статичнi екземпляри класу. Доступ до полів даних та функцій-членів статичних екземплярів класу ззовнi функцiй- членiв цього класу здiйснюється за допомогою операцiї розширення області видимості :: , що застосовується до імені класу або за допомогою “. “чи “-->“ ( як і для звичайних полiв).
Приклад :
static statpol a;
main()
{ cout<<a.i<<“\n”;
cout<<statpol::i;
}
Статичні поля зручно використовувати у випадку, коли необхідно виконувати якісь операції над усіма екземплярами класу чи зберігати інформацію про всі екземпляри класу. Наприклад, статичним полем може бути лічильник екземплярів деякого класу.
Приклад:
Class Point
{
floаt x,y;
static Point *first=NULL;
static Point *last=NULL;
Point*next;
publiс:
Point (float ax, float ay)
{x=ax; y=ay;
if (first==NULL) {first=this; last=this}
else {last.next=this; last=this;}}
vоid draw ()
{...}
static void drawAll()
{point *p=first;
if (p==NULL) return;
do p->draw() while (p=p->next!=NULL);
}};
В прикладі всі екземпляри класу, що породжуються, зберігаються в списку, який потім використовується для малювання всіх створених на даний момент фігур:
if (point :: first!=NULL)
point :: drawAll()
Iснують чiткi правила iнiцiалiзацiї полiв всерединi опису класу. Звичайне поле не може бути iнiцiалiзоване при описаннi класу . Iніціалізація статичних полів допускається. Статичнi змiннi можуть бути iнiцiалiзованi за межами класу.
Якщо екземпляр класу оголошений як статичний, то цей клас не може мати конструкторiв, i вiдповiдно нi одне з його полiв не може мати тип іншого класу, який має конструктор.
Приклад:
class A
{private:
int large;
static int small;
};
class B
{private:
int bigwant;
static int count;
public:
B(void)
{bigwant=25;}
};
class C
{private:
B b;}
class D
{private:
static int size;
static A an A;
static B a B;
static C a C;//помилка
public:
D(void) { }
};
Відмітимо, що у випадку якщо оголошений статичний елемент або статичне поле в розділі public, то доступ можливий i через “.”.
Статичні функцiї-члени можуть виконувати будь-які оператори, однак вони не отримують вказівник this та не мають доступу ні до яких полів даних та функцій-членів класу (за винятком статичних). Для виклику статичної функції може використовуватись як об’єкт так і ім’я класу:
Tanyclass::staticfunction();
Статична функція-член виконує дії, що стосуються всіх об’єктів даного класу.
Цікаві ситуації виникають , якщо розглядати локальнi та глобальнi об'єкти. Розглянемо такий приклад:
TTime t1(5);
void f() {
static TTime t2(200);
}
main ()
{ f();}
В прикладі конструктор, очевидно, викличеться двiчі: спочатку для глобального об’єкту а потім при виклиці функції f(). А якщо в функції main() не викликається функція f()? Чи викликається конструктор для локального статичного об'єкту, якщо функцiя, де вiн описаний, не викликається? Відповідь на таке запитання невизначена .
Для глобальних статичних об'єктiв конструктори викликаються в тому порядку, в якому вони описанi в програмi. Деструктори - в зворотньому порядку. Причому параметри конструкторiв для статичних об'єктiв повиннi бути константними виразами. Ситуація в прикладі, описаному нижче не допускається.
void g(int a)
{static TTime t(a);
}
Контрольні запитання
1. В чому специфіка статичних полів даних та функцій?
2. В чому специфіка статичних об’єктів ?
3. Чи викликається конструктор для локального статичного об'єкту, якщо функцiя, де вiн описаний, не викликається?
4. Чи можна ініціалізувати статичні поля ?
5.Як ініціалізуються статичні поля об’єктів ?
6.В чому полягає специфіка статичних функцій -членів?
7. Коли зручно використовувати статичні поля ?
Завдання 6:
1. Описати клас Літак (див. завдання) , у якому інформація про простір є статичним масивом (дво- чи трьохвимірним).
2. Описати клас Океан (див. завдання) , у якому інформація про простір є статичним масивом (дво- чи трьохвимірним).
3. Модифікувати клас Літак так, щоб він мав деякий “локатор”, тобто міг аналізувати простір навколо себе деякого радіусу.
4. Протестувати клас Point , доповнивши його функцією Draw().
5. Написати та протестувати приклад , коли статична функція працює з статичними полями даних класу.
6. Описати однозв’язний список об’єктів, що містять статичне поле - ціле значення та статичну функцію, яка друкує значення цього поля. Користуючись лише цією функцією ( без використання інших засобів виводу на екран) написати програму, яка друкує кілкість елементів списку.