русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Деструктори


Дата додавання: 2014-04-22; переглядів: 901.


Після того, як ми дізналися, що об’єкти можна нумерувати, покажемо одну цікаву властивість деструкторів. Програма 13.14 виводить на екран повідомлення «endofprogram» при завершенні програми. Але, як показує приклад роботи програми, після цього ще дещо відбувається. А саме: три об’єкти, які були створені в процесі роботи програми, повинні бути видалені до її завершення, щоб відновився доступ до пам’яті. Про це потурбується компілятор, виконуючи деструктор.

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

Ініціалізація копіювання і присвоювання

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

Ми постійно використовуємо оператор присвоювання, можливо, навіть не задумуючись про те, що за ними стоїть з точки зору компілятора. Нехай а1 і а2 – деякі об’єкти. Попри те, що ми наказуємо компілятору «присвоїти а2 значення а1», вираз

а2=а1

змусить компілятор копіювати дані з а1 елемент за елементом в а2. Так за замовчуванням діє оператор присвоювання.

Ми знайомі з ініціалізацією змінних. Ініціалізація одного об’єкту іншим, як у виразі

alpha a2(a1);

викликає подібні дії. Компілятор створює новий об’єкт а2, потім елемент за елементом копіює дані з а1 в а2. Це саме те, що за замовчуванням виконує конструктор копіювання.

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

 


<== попередня лекція | наступна лекція ==>
Доступ до статичних функцій | Перезавантаження оператора присвоювання


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн