русс | укр

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

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


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


Перезавантаження оператора присвоювання


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


Наступний приклад (програма 13.15) продемонструє технологію перезавантаження оператора присвоювання.

#include<iostream.h>

#include<conio.h>

#include<stdio.h>

#include<bios.h>

///////////////

class alpha

{private:

int data;

public:

alpha() //конструктор без аргументу

{ }

alpha(int d) //конструктор з 1 аргументом

{data=d;}

void display()

{cout<<data;}

 

alpha operator=(alpha& a) //перезавантаження =

{data=a.data;

cout<<”\nЗапущений оператор =”;

return alpha(data);

}

};

////////////////

 

int main()

{clrscr();

alpha a1(37);

alpha a2;

a2=a1; //запускається =

cout<<”\na2=”;a2.display();

alpha a3=a2; //не запускається =

cout<<”\na3=”;a3.display();

cout<<endl;

bioskey(0);

return 0;

}

Програма 13.15

Клас alpha дуже простий, в ньому міститься тільки один елемент даних. Конструктори ініціалізують дані, а методи виводять їх значення на екран. От і все, що тут робиться. А новизна програми 13.15 полягає в функції operator=(), що перезавантажує оператор =.

В main() ми визначаємо змінну а1 і присвоюємо їй значення 37, визначаємо змінну а2, але значення їй не присвоюємо. Потім присвоюємо а2 значення а1

a2=a1;

Тим самим ми запускаємо нашу перезавантажувану функцію operator=()/

 

Ініціалізація – це не присвоювання.

В останніх двох рядках програми 13.15 ми ініціалізуємо об’єкт а3 об’єктом а2 і виводимо його значення на екран. Нехай нас не дивує синтаксис. Виразу

alpha a3=a2;

відповідає не присвоювання, а ініціалізація. При цьому ефект такий сам, як при виконанні виразу

alpha a3(a2);

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

 

Відповідальність

Коли перезавантажується оператор присвоювання, то передбачається, що за все, що раніше оператор виконував за замовчуванням, відповідає програміст. Клас alpha з програми 13.15 включає в себе тільки один елемент data, тому функція operator=() копіює його значення за допомогою такого виразу:

data=a.data;

Крім того, функція виводить на екран повідомлення «Запущений оператор =», завдяки якому ми можемо впевнитися, що функція виконується.

 

Передача за посиланням

Аргумент для функції operator=() передається за посиланням.

alpha operator=(alpha& a)

Це не є особливо необхідним (можна спробувати вилучити символ & і пересвідчитися, що в роботі програми нічого не поміняється), але звичайно саме так і чинять. Як ми знаємо, аргумент, що передається за значенням, створює в пам’яті власну копію для функції, якій він передається. Аргумент, що передається функції operator=() не є винятком. Якщо об’єкти великі, то їх копії займатимуть в пам’яті багато місця без всякої користі. Коли ж значення аргументу передається за посиланням, копії не створюються, що допомагає економити пам’ять.

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

 


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


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