- •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 Використання завершуючих обробників виключень
4.3 Досягнення високої ефективності. Конструктор копіювання.
Конструктор копiювання є конструктором особливого виду: вiн
приймає в якостi параметра константне посилання на об`єкт класу ( const тип_класу &) чи просте посилання на об`єкт( тип-класу &). Приклад:
class Card
{
int x,y;
public:
Card (const Card & src );
};
Card :: Card( const Card & src )
{
x=src.x;
y=src.y;}
Розглянемо , де бувають корисними конструктори копіювання. Розглянемо таку програму:
# define LARGE 30000
struct Lange
{
int data[LARGE];
Large (void)
{
for (int i=0; i<LARGE; i++)
data[i]=i;
}
~LARGE (void) {}
LARGE slow(Large b)
{
Large ans;
{ for (int i=0; i<LARGE; i++)
ans.data[i]=b.data[i];
return ans;
}
};
main ()
{
Large a,b;
{ for (int i=0; i<100; i++)
a=slow(b);
};
Час її роботи є порівняно великим. Як збільшити швидкодію ? Це можна зробити з використанням конструктора копіювання:
class Large1
{
private:
Large1 (const Large1 & b);
public:
int data[LARGE];
Large1 (void)
{
for (int i=0; i<LARGE; i++)
data[i]=i;
}
~LARGE1 (void) {}
};
Large1 :: Large1 (const Large1 & b);
{ for (int i=0; i<LARGE; i++)
data[i]=b.data[i];
}
inline Large1::fast (const Large1 & b)
{ return Large1(b);}
main ()
{
Large1 a,b;
{ for (int i=0; i<100; i++)
a=fast(b);
};
Дана версія програми, що використовує конструктор копіювання, працює значно швидше. Адже за рахунок конструктора копiювання не створюються локальні копiї структур . Конструктор в закритiй частинi опису класу використовується для прискорення оператора return в fast. Це можна пояснити тим, що дані , розміщені в закритому розділі класу, в даному випадку містяться в одному сегменті і доступ до них здійснюється з використанням near-адресації, тобто одного лише зміщення.
Контрольні запитання
1. Для чого введені конструктори та деструктори ?
2. Як описуються конструктори та деструктори?
3. Чи обов’язковим є наявність в класі конструкторів та деструкторів?
4. В чому полягає специфіка конструктора без параметрів ?
5. Що відбувається, якщо оголошується екземпляр класу, що не містить конструкторів ?
6. Чи можна викликати конструктори без створення екземпляру класу(ніби звичайну функцію-член)?
7. Чи можна перегружати конструктори?
8. Чи допускаються в конструкторах параметри по замовчуванню ?
9. Коли викликаються деструктори ?
10. Чи можна явно викликати деструктор класу?
11. Чи може мати деструктор параметри ?
12. Для чого використовується конструктор копіювання ?
Завдання 4:
1. Дописати в усіх створених в завданні 1 класах відповідні конструктори та деструктори.
2. Придумати та протестувати приклади виклику конструкторів для ситуації, аналогічної прикладу з класом str для інших типів даних.
3. Написати програму для ілюстрації автоматичного виклику деструкторів . Структури програми можна вибрати, наприклад, такі:
а)
class pr{
//...
public:
~pr()
{
cout<<"Деструктор \n";
}
};
void main(void)
{ pr p1;
{
pr p2;
{pr p3;
cout<<"\n Pa-Pa 3";
}
cout<<"\n Pa-Pa2";
}
cout<<"\n Pa-Pa1";
}
б) class pr{
//...
}
class pr1{
//...
}
. . .
void f()
{ pr a;
...
}
void f1()
{pr1 b;
...
f();
}
...
main()
{prn b;
f(); }
В деструкторах класів видаються відповідні повідомлення.
4. Придумати корисний тип даних, який не є вбудованим в жодній з мов програмування та реалізувати його як абстрактний тип даних С++. Описати відповідні конструктори та деструктори. Написати програму, що використовує цей тип даних.
5.Розробиити клас автомат з скінченною множиною станів. На основі цього класу побудувати модель марківського процесу з скінченною множиною станів (в кожен момент часу відбувається випадковий перехід в один з можливих станів) .
6. Модифікувати попередній приклад, задаючи певні закони переходу з одного стану в інший.
7. Модифікувати клас Автомат так, щоб за допомогою нього можна було будувати моделі n-вимірного марківського процесу з скінченною множиною станів.