Наступний приклад (програма 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). Якщо ж компілятор генерує ще якісь об’єкти кожного разу, коли виконується оператор присвоювання, то ми ризикуємо дуже завищити оцінку їх кількості. За допомогою передачі за посиланням вдається ліквідувати прецеденти несправжнього створення об’єктів.