У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


ім'я покажчика >А.< ім'я конструктора >(< список параметрів >) .

В Borland Pascal 7.0 є можливість використовування розширеного варіанту процедури і функції New, який дозволяє в одній операції виділити пам'ять під об'єкт і викликати конструктор:

процедура

New (< ім'я покажчика >

< ім'я конструктора >(< список параметрів >));

функція

< ім'я покажчика >: = New(< nm « покажчик на клас »>

< ім'я конструктора >(< список параметрів >))

Такий варіант процедури або функції New працює таким чином. Спочатку здійснюється спроба виділити пам'ять під об'єкт, а потім викликається конструктор.

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

Dispose(<ім’я покажчика >);

Якщо клас об'єкту включає віртуальні методи, то при знищенні об'єкту обов'язково повинен викликатися спеціальний метод -деструктор. Так само, як для конструктора, для деструкції службове слово Procedure повинне замінюватися службовим словом Destructor, що має на увазі виконання деяких спеціальних дій при знищенні об'єкту: деструкція визначає реальний розмір об'єкту і передає його процедурі Dispose. Якщо конструктор рекомендується називати Init, то деструкцію звичайно називають Done. Деструкції можуть успадковуватися, бути статичними або віртуальними. Звичайно вони використовуються для звільнення пам'яті, виділеної під динамічні поля об'єкту.

Деструкцію можна викликати в розширеному форматі процедури Dispose:

Dispose (< ім'я покажчика >,< ім'я деструкції >);

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

Destructor < ім'я класу > . Done;

virtual;

Begin

End;

Контроль розподілу пам'яті. Якщо пам'яті для розміщення динамічного об'єкту або динамічних полів виявиться недостатньо, то виклик процедури або функції New приведе до виникнення помилки часу виконання з номером 203 (Heap overflow error - «переповнювання динамічної пам'яті»).

Аварійного завершення програми в даному випадку можна уникнути, визначивши власну функцію обробки даної помилки і вказавши її адресу середовищу програмування Borland Pascal:

Function HeapFunc(size: Word) .integer; far; Begin HeapFunc:-l; end;

HeapError: =@HeapFunc;

Тоді при виявленні браку пам'яті процедура або функція New поверне покажчик із значенням nil, що можна перевірити в програмі.

Якщо таку ситуацію знаходить конструктор при розподілі пам'яті для розміщення динамічних полів, то доцільне, щоб він відмінив всі вже виконані розподіли пам'яті. Для цього введена стандартна процедура Fail без параметрів. Процедура Fail може бути викликана тільки з конструктора. Вона відміняє вже виконані призначення пам'яті і повертає значення nil в якості адреси об'єкту.

Для контролю розміщення динамічних полів статичного об'єкту здійснюється перевірка значення конструктора, що повертається. Якщо це значення рівне false, то в конструкторі була виконана директива fail.

Як і для будь-якої змінни мови C++, об'єкту деякого класу пам'ять може бути виділена статично - на етапі компіляції або динамічно - під час виконання програми.

При динамічному розподілі пам'ять під об'єкт класу виділяється на етапі виконання з так званої вільної (динамічній) пам'яті. Причому реальне виділення і звільнення ділянок здійснюється в момент, визначуваний програмістом (при виконанні функцій new і delete) і повністю їм контролюється.

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

статичні об'єкти з динамічними полями;

динамічні об'єкти із статичними полями;

динамічні об'єкти з динамічними полями.

Визначення класів для реалізації кожного з названих видів об'єктів має деякі особливості в мові C++, пов'язані із специфікою його використовування.

Статичні об'єкти з динамічними полями. В C++ можна виділити динамічно пам'ять під змінну будь-якого типу, визначеного до цього моменту.

Для цього передбачено декілька способів, але найбільш зручним є використовування функції new. Зручність механізму, що надається new, полягає в тому, що для його застосування не вимагається визначати конкретний розмір пам'яті, що виділяється, як в інших випадках. Необхідний розмір визначається автоматично типом змінної, хоча кількість таких ділянок можна вказати. Операція new виділяє необхідну пам'ять для розміщення змінної і повертає адресу виділеної ділянки, перетворюючи покажчик до потрібного типу. Якщо із яких-небудь причин пам'ять не може бути виділена, функція повертає нульовий покажчик (NULL). Звільняється пам'ять, виділена по new, за допомогою функції delete також відповідно до типу змінної.

Найбільш часто динамічний розподіл пам'яті застосовують в класах, що використовують в якості полів масиви, рядки, структури і їхні комбінації. В цьому випадку поле містить покажчик на змінну відповідного типу. Покажчик набуває своє значення при виділенні пам'яті під структуру даних, для якої він визначений. Звільнення цієї пам'яті відбувається за адресою в покажчику відповідно до типу змінної.

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

При перевизначенні операцій введення-виведення конкретні значення полів об'єкту стають відомими тільки після введення даних. Тому для більш ефективного і коректного використовування пам'яті доцільний реальний розподіл пам'яті під поля такого об'єкту виконувати не за допомогою конструктора класу, а під час операції введення. Конструктор в цьому випадку повинен бути неініціалізувало.

Слід пам'ятати, що можливе введення нових значень полів у вужі існуючий об'єкт (наприклад, багатократне використовування деякого об'єкту в якості проміжної змінни). Тоді, перш ніж виділяти пам'ять під нове значення поля, необхідно звільнити пам'ять, виділену раніше під попереднє значення, оскільки автоматичне звільнення невживаної пам'яті, виділеної по new, компілятором не передбачено. Інакше ці ділянки залишаться в зайнятому стані після


Сторінки: 1 2 3 4 5 6 7 8 9