русс | укр

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

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


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


Уникайте неправильних присвоювань


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


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

alpha=alpha;

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

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

if(this==&S)

return *this;

в початок функції operator=(). Це повинно розв’язати проблему, яка виникла.

 


<== попередня лекція | наступна лекція ==>
Удосконалена програма роботи з типом String | Підсумок


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