Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_KAZYMYR.doc
Скачиваний:
14
Добавлен:
09.11.2019
Размер:
3.71 Mб
Скачать

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.Конструктори й деструктори в С++

Конструктори й деструктори в С++- це особливий різновид функцій-елементів класів. Однак вони не є функціями у звичайному змісті. Відмінності конструкторів від функцій полягають у наступному:

  1. Конструктор має ім'я, що збігається з ім'ям класу.

  2. Конструктор не має типу значення, що повертається.

  3. У тілі конструктора не використовується оператор return. Конструктор повертає як результат об'єкт даного класу.

  4. Конструктор повинен бути оголошений у секції public.

  5. Конструктор не може бути friend.

  6. Конструктор, як і інші методи, може бути перевантажений, а також може використовувати параметри за замовчуванням. Виклик потрібного конструктора визначається по числу зазначених параметрів.

сlass Point {int x,y;

рublic:

Point (int x);

Point (int x, int y);

…………………};

Point::Point () {x=10; y=10;}

Примітка: всі конструктори, прототипи яких зазначені в числі методів класу, повинні бути реалізовані.

  1. Конструктор без параметрів є конструктором за замовчуванням. Його визначення не є обов'язковим. Якщо він відсутній, то компілятор створює його автоматично. Однак, якщо передбачається використання масивів об'єктів даного класу, то необхідно явно визначити конструктор без параметрів. Використання конструктора зі значеннями за замовчуванням у цьому випадку недостатньо:

Point (); // конструктор за замовчуванням (без параметрів)

Примітка: конструктор – не обов'язковий метод в описі класу. Якщо він не визначений, то використовується конструктор за замовчуванням. Однак варто враховувати, що хороший стиль програмування має на увазі звертання до змінної тільки через методи, у тому числі це стосується й ініціалізації змінних при створенні об'єктів.

  1. Конструктор може мати параметри будь-якого типу, за винятком типу класу, у якому вони описуються. Однак, як параметр може бути посилання на власний клас. Саме так побудований конструктор копіювання, що автоматично включається в роботу, коли відбувається присвоювання змінної значення об'єкта:

сlass Point {...……} b; // створюється статичний об'єкт

Point c; // оголошується об'єкт Point

c=b; // викликається конструктор копіювання

Конструктор копіювання, побудований за замовчуванням, робить побітове копіювання об'єктів і має тільки один параметр - посилання на клас:

Point (Point &a){...…………} // конструктор копіювання

При необхідності порядок копіювання об'єктів може бути змінений, але тоді потрібно застосувати свій конструктор копіювання:

Point (Point &a( int x=5);

Існують наступні можливості ініціалізації полів даних об'єктів:

  1. Варто враховувати неоднозначність виклику конструктора без параметрів і з параметрами за замовчуванням. Якщо конструктор містить параметри, то вони повинні бути зазначені в дужках:

Point a; // викликається конструктор за замовчуванням

Point b(1,2); // викликається конструктор з одним параметром

Point two(1); / викликається конструктор із двома параметрами

Для змінних елементарних типів також існують конструктори за замовчуванням, які явно не описуються. Для них також може бути використана ініціалізація при оголошенні.

int a(1); // a=1;

Також допускається:

Point sec=1;

int b=1;

  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);}

В останньому випадку порядок перерахування в списку ініціалізації може бути довільний.

Примітка: зазначений підхід так само може бути застосований і до простих типів.

  1. При оголошенні масиву об'єктів, наприклад, для завдання лінії (Line), що складається з об'єктів (Point) класу з конструктором, цей клас повинен мати конструктор без параметрів:

Point line[10];

  1. Динамічні об'єкти створюються шляхом виклику оператора new, причому привласнює значение, що, повинне мати тип покажчика на клас:

Point * pOne = new Point(1,2);

Аналогічним образом створюються масиви об'єктів:

Point * pArrayPoint = new Point[100];

  1. Можуть бути створені об'єкти без імені, коли вони передаються в параметрах функції:

f(Point(2,4));

Примітка: конструктори не можна викликати явно за винятком останнього випадку.

Порядок виклику конструкторів у С++:

  1. Конструктори викликаються автоматично, коли створюються об'єкти.

  2. Конструктори викликаються явно при створенні динамічних об'єктів, коли використовується оператор new.

  3. Конструктори глобальних (статичних) об'єктів викликаються в порядку їхнього оголошення, причому до виклику функції main(). Це означає, що в програмі може бути виконаний код, що виконується перед операторами функції main();

  4. Конструктори локальних і тимчасових об'єктів активізуються, коли стає активним їхній контекст (при вході у відповідний блок).

Для знищення об'єктів у С ++ введена спеціальна функція деструктор:

сlass Point { ...………

public

~Point(); // деструктор

…………};

Особливості визначення деструкторів:

  1. Перед іменем деструктора ставиться знак ~  а саме ім'я деструктора збігається з ім'ям класу.

  2. Розміщується в секції public.

  3. Не може мати параметрів.

  4. Деструктор не можна перевантажувати.

  5. Якщо деструктор не зазначений явно, компілятор автоматично створить деструктор за замовчуванням.

Порядок виклику деструкторів:

  1. Деструктор викликається явно, коли об'єкт виходить за межі свого контексту.

  2. Деструктори викликаються у зворотній послідовності виклику відповідних конструкторів.

  3. Для динамічно створюваних об'єктів деструктор неявно не викликається. Тому, для звільнення займаної ними пам'яті необхідно явно викликати деструктор, використовуючи оператор delete:

Point* xptr;

хptr = new Point[2];

delete [2] xptr; // або delete xptr;

Примітка: розроблювач програми повинен стежити, щоб всі динамічні об'єкти до закінчення роботи програми були знищені.

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