русс | укр

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

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


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


Повернення результатів роботи функції


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


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

alpha func();

і вона викликалася виразом

a2=func();

Конструктор копіювання в цьому випадку запустився б для того, щоб створити копію повернутого функцією func() результату, а потім, після запуску оператора присвоювання, цей результат був би збережений в а2.

 

Чому не просто Х(Х)?

Чи треба використовувати посилання в аргументі конструктора копіювання? Чи можна просто передати значення? Ні, компілятор повідомляє про «вихід за межі пам’яті» при спробі прокомпілювати вираз

alpha(alpha a)

Чому це трапляється? Тому, що при передачі аргументу за значенням створюється його копія. Її створює конструктор копіювання. Але ж ми і запускаємо конструктор копіювання, тобто він намагається запустити сам себе, поки не вийде за межі пам’яті. Так що в конструктор копіювання аргумент повинен передаватися за посиланням, що не призводить до створення копій об’єктів.

 

Слідкуйте за деструкторами

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

 

Визначення і конструктора копіювання, і оператора присвоювання

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

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

 

Заборона копіювання

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

class alpha

{private:

alpha& operator=(alpha&);//приховане присвоювання

alpha(alpha&);//приховане копіювання

Як тільки ми спробуємо скопіювати інформацію

alpha a3,a2;

a3=a2;

alpha a3(a1);

компілятор повідомить, що функція недоступна. При тому нема потреби визначати ці функції, бо вони ніколи не будуть викликані.

 


<== попередня лекція | наступна лекція ==>
Конструктор копіювання | Ефективне використання пам’яті класом String


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