- •Передмова
- •Розділ 1 об'єктний підхід у програмуванні
- •1.1.Причини виникнення ооп
- •1.1.1.Складність об'єкта дослідження
- •1.1.2.Складність процесу розробки програмного забезпечення
- •1.1.3.Складність опису окремих елементів
- •1.2.Парадигма ооп
- •1.3.Історія розвитку ооп
- •Розділ 2 об'єкти й класи: інкапсуляція
- •2.1.Структура об'єкта й класу
- •2.2.Особливості опису класів у мовах ооп
- •2.2.1.Опис класів в SmallTalk
- •2.2.3.Опис класів в Delphi
- •2.2.4.Опис класів в Java
- •2.3.Поля даних та їх ініціалізація
- •2.3.1.Визначення полів даних в SmallTalk
- •2.3.3.Визначення полів даних в Delphi
- •2.3.4.Визначення змінних в Java
- •2.4.Доступ до даних
- •2.4.1.Доступ до даних в SmallTalk
- •2.4.3.Доступ до даних в Delphi
- •2.4.4.Доступ до даних в Java
- •2.5.Спеціальні змінні
- •2.5.1.Спеціальні змінні в SmallTalk
- •2.5.3.Спеціальні змінні в Java
- •2.5.4.Спеціальні змінні в Delphi
- •2.6.Посилання
- •2.6.1.Визначення посилань в SmallTalk, Delphi і Java
- •2.7.Методи
- •2.7.1.Загальна схема визначення методу
- •2.7.2.Визначення методів в SmallTalk
- •2.7.4.Визначення методів в Delphi
- •2.7.5.Визначення методів в Java
- •2.8."Дружні" методи
- •2.8.2.Аналог дружніх функцій в Delphi
- •2.9.Конструктори й деструктори
- •2.9.1.Конструктори й деструктори в SmallTalk
- •2.9.3.Конструктори й деструктори в Delphi
- •2.9.4.Конструктори й деструктори в Java
- •2.10.Властивості
- •2.10.1.Властивості в Delphi
- •2.10.2.Властивості в Java
- •2.12.Абстрактні методи
- •Розділ 3 успадкування
- •3.1.Форми успадкування
- •3.2.Успадкування в SmallTalk
- •3.3.1.Віртуальне успадкування
- •3.3.2.Правило сумісності типів
- •3.3.3.Використання конструкторів і деструкторів при успадкуванні
- •3.4.Успадкування в Delphi
- •3.4.1.Ієрархія класів в Delphi
- •3.4.2.Створення нових компонентів
- •3.5.Успадкування в Java
- •3.5.1.Використання ключового слова super
- •3.5.2.Клас Object
- •Розділ 4 поліморфізм
- •4.1.Віртуальні методи
- •4.2.1.Механізм пізнього зв'язування
- •4.2.2.Таблиця віртуальних методів
- •4.3.Поліморфізм в Delphi
- •4.3.1.Заміщення віртуальних і динамічних методів
- •4.3.2.Приведення типів
- •4.4.Поліморфізм в Java
- •4.5.Поліморфізм в SmallTalk
- •5.1.Потокові класи
- •5.1.1.Ієрархія потокових класів
- •5.1.2.Форматоване введення/ виведення
- •5.1.3.Маніпулятори
- •5.1.4.Введення/виведення у файл
- •5.2.Контейнерні класи
- •5.2.1.Ітератори
- •5.2.2.Визначення контейнерних класів
- •5.2.3.Стандартні контейнерні класи
- •5.3.1.Параметиізовані класи (шаблони)
- •5.3.2.Ітератори stl
- •5.3.3.Узагальнені алгоритми
- •Література
- •Додатки лабораторна робота №1 об'єкти й повідомлення в smalltalk
- •Лабораторна робота №2 класи й методи в smalltalk
- •Листинг 3.1
- •Листинг 3.2
- •Листинг 3.3
- •Лабораторна робота 5 компоненти в delphi
- •Лабораторна робота 6 меню й вікна в delphi
- •Лабораторна робота 7 розробка меню в java
- •Лабораторна робота 8 робота з подіями в java
2.9.Конструктори й деструктори
Конструктори - це спеціальні методи, призначені для створення об'єктів і ініціалізації їхніх полів даних. Деструктори навпроти призначені для знищення об'єктів і звільнення займаної ними пам'яті.
По способу створення розрізняють об'єкти автоматичні, статичні й динамічні. Автоматичний об'єкт створюється щораз при його оголошенні в ході виконання програми й знищується при виході із блоку, у якому він був оголошений. Статичний об'єкт створюється в сегменті даних один раз при запуску програми й знищується при її завершенні. Динамічний об'єкт створюється в процесі виконання програми в купі за допомогою оператора new і повинен бути знищений за допомогою оператора delete до завершення програми.
Періодичні об'єкти, які не використовуються в програмі, необхідно видаляти. Операція по звільненню пам'яті, займаної об'єктами, називається "зборкою сміття".
2.9.1.Конструктори й деструктори в SmallTalk
В SmallTalk всі об'єкти створюються динамічно.
Є метод класу Object, що називається new. Оскільки всі класи є підкласами Object, те вони можуть використовувати цей метод.
|a| “локальна змінна”
a:=Pen new.
Метод new може бути заміщений у підкласах класу Object, але в кожному разі він повинен викликатися, оскільки забезпечує створення об'єкта в пам'яті:
new x: a y: a // визначення методу класу
Super new init x: a y: a
init x: a y: a // визначення методу екземпляра класу
x:=a. y:=a.
Примітка: змінна super передбачає виклик для об'єкта-одержувача методу new x: a y: a методу new суперкласу, а саме класу Object. Потім викликається метод екземпляра init x: a y: a, що ініціалізує змінні екземпляра x і y. Наприклад, створення точки з координатами (5, 10) буде результатом виконання виразу:
Point new x: 5 y: 10.
В SmallTalk передбачена автоматична "зборка сміття". Тобто об'єкти, які є nil (на них немає посилань у програмі) знищуються програмою, що запускає періодично "зборку сміття". Об'єкти, на які вказують тимчасові змінні, знищуються при виході із програми, у якій вони використовуються. Метод, що дозволяє видалити посилання на об'єкти, називається release:
a:= Pen new. “створення об'єкта класу Pen”
a release. “знищення об'єкта”
2.9.2.Конструктори й деструктори в С++
Конструктори й деструктори в С++- це особливий різновид функцій-елементів класів. Однак вони не є функціями у звичайному змісті. Відмінності конструкторів від функцій полягають у наступному:
Конструктор має ім'я, що збігається з ім'ям класу.
Конструктор не має типу значення, що повертається.
У тілі конструктора не використовується оператор return. Конструктор повертає як результат об'єкт даного класу.
Конструктор повинен бути оголошений у секції public.
Конструктор не може бути friend.
Конструктор, як і інші методи, може бути перевантажений, а також може використовувати параметри за замовчуванням. Виклик потрібного конструктора визначається по числу зазначених параметрів.
сlass Point {int x,y;
рublic:
Point (int x);
Point (int x, int y);
…………………};
Point::Point () {x=10; y=10;}
Примітка: всі конструктори, прототипи яких зазначені в числі методів класу, повинні бути реалізовані.
Конструктор без параметрів є конструктором за замовчуванням. Його визначення не є обов'язковим. Якщо він відсутній, то компілятор створює його автоматично. Однак, якщо передбачається використання масивів об'єктів даного класу, то необхідно явно визначити конструктор без параметрів. Використання конструктора зі значеннями за замовчуванням у цьому випадку недостатньо:
Point (); // конструктор за замовчуванням (без параметрів)
Примітка: конструктор – не обов'язковий метод в описі класу. Якщо він не визначений, то використовується конструктор за замовчуванням. Однак варто враховувати, що хороший стиль програмування має на увазі звертання до змінної тільки через методи, у тому числі це стосується й ініціалізації змінних при створенні об'єктів.
Конструктор може мати параметри будь-якого типу, за винятком типу класу, у якому вони описуються. Однак, як параметр може бути посилання на власний клас. Саме так побудований конструктор копіювання, що автоматично включається в роботу, коли відбувається присвоювання змінної значення об'єкта:
сlass Point {...……} b; // створюється статичний об'єкт
Point c; // оголошується об'єкт Point
c=b; // викликається конструктор копіювання
Конструктор копіювання, побудований за замовчуванням, робить побітове копіювання об'єктів і має тільки один параметр - посилання на клас:
Point (Point &a){...…………} // конструктор копіювання
При необхідності порядок копіювання об'єктів може бути змінений, але тоді потрібно застосувати свій конструктор копіювання:
Point (Point &a( int x=5);
Існують наступні можливості ініціалізації полів даних об'єктів:
Варто враховувати неоднозначність виклику конструктора без параметрів і з параметрами за замовчуванням. Якщо конструктор містить параметри, то вони повинні бути зазначені в дужках:
Point a; // викликається конструктор за замовчуванням
Point b(1,2); // викликається конструктор з одним параметром
Point two(1); / викликається конструктор із двома параметрами
Для змінних елементарних типів також існують конструктори за замовчуванням, які явно не описуються. Для них також може бути використана ініціалізація при оголошенні.
int a(1); // a=1;
Також допускається:
Point sec=1;
int b=1;
Об'єкти з конструкторами можуть бути проініціалізовані за допомогою списків ініціалізаторів, які вказуються у фігурних дужках.
Point v ={1,2}; // v.x=1 , v.y=2
Якщо клас містить об'єкти інших класів у якості змінних, то при ініціалізації об'єктів даного класу повинні бути спочатку проініціалізовані об'єкти змінних шляхом включення викликів відповідних конструкторів при визначенні конструктора основного класу через список ініціалізації:
сlass Point ;
сlass Rect {
public:
Point a,b;
Rect (Point &lefttop, Point &right bottom)
{a=lefttop; b = rightbottom;}
Rect (int left, int right, int top, int bottom)
{a.x =left; b.x = right; a.y = top; b.y = bottom;}
};
Другий конструктор може бути визначений у такий спосіб:
Rect (int left, int right, int top, int bottom): a(left,top), b(right,bottom){}
Це подібно:
Rect::Rect (int left, int right, int top, int bottom)
{a(left,top); b(right,bottom);}
В останньому випадку порядок перерахування в списку ініціалізації може бути довільний.
Примітка: зазначений підхід так само може бути застосований і до простих типів.
При оголошенні масиву об'єктів, наприклад, для завдання лінії (Line), що складається з об'єктів (Point) класу з конструктором, цей клас повинен мати конструктор без параметрів:
Point line[10];
Динамічні об'єкти створюються шляхом виклику оператора new, причому привласнює значение, що, повинне мати тип покажчика на клас:
Point * pOne = new Point(1,2);
Аналогічним образом створюються масиви об'єктів:
Point * pArrayPoint = new Point[100];
Можуть бути створені об'єкти без імені, коли вони передаються в параметрах функції:
f(Point(2,4));
Примітка: конструктори не можна викликати явно за винятком останнього випадку.
Порядок виклику конструкторів у С++:
Конструктори викликаються автоматично, коли створюються об'єкти.
Конструктори викликаються явно при створенні динамічних об'єктів, коли використовується оператор new.
Конструктори глобальних (статичних) об'єктів викликаються в порядку їхнього оголошення, причому до виклику функції main(). Це означає, що в програмі може бути виконаний код, що виконується перед операторами функції main();
Конструктори локальних і тимчасових об'єктів активізуються, коли стає активним їхній контекст (при вході у відповідний блок).
Для знищення об'єктів у С ++ введена спеціальна функція деструктор:
сlass Point { ...………
public
~Point(); // деструктор
…………};
Особливості визначення деструкторів:
Перед іменем деструктора ставиться знак ~ а саме ім'я деструктора збігається з ім'ям класу.
Розміщується в секції public.
Не може мати параметрів.
Деструктор не можна перевантажувати.
Якщо деструктор не зазначений явно, компілятор автоматично створить деструктор за замовчуванням.
Порядок виклику деструкторів:
Деструктор викликається явно, коли об'єкт виходить за межі свого контексту.
Деструктори викликаються у зворотній послідовності виклику відповідних конструкторів.
Для динамічно створюваних об'єктів деструктор неявно не викликається. Тому, для звільнення займаної ними пам'яті необхідно явно викликати деструктор, використовуючи оператор delete:
Point* xptr;
хptr = new Point[2];
delete [2] xptr; // або delete xptr;
Примітка: розроблювач програми повинен стежити, щоб всі динамічні об'єкти до закінчення роботи програми були знищені.
