
- •10 Перевантаження операторiв.
- •10.1 Перевантаження операторів. Загальний підхід.
- •10.2 Перетворення типів.
- •10.3 Перевантаження деяких операторів.
- •10.3.1 Оператор індексування масиву.
- •10.3.2 Перевантаження оператора виклику функції.
- •10.3.3 Оператор доступу до члена класу.
- •10.3.4 Перевантаження операторів інкремента та декремента.
- •10.3.5 Перевантаження операторів управління пам’яттю (new,delete).
- •10.3.6 Перевантаження оператора присвоювання.
10.3.6 Перевантаження оператора присвоювання.
Повернемось до проблеми , яка виникає при присвоюванні об’єктів. Ця проблема легко розв’язується за допомогою перевантаження оператора присвоювання.
class intarray{
int size;
int *ar;
public:
intarray(int size)
{ ar=new int[anintarray. size];}
void operator=(const intarray & anintarray)
{ ar=new int[anintarray.size];
for(int i=0;i<size;i++) ar[i]=anintarray.ar[i]; }
};
Тоді в main() - функції можемо написати:
main()
{ intarray a(100);
intarray b=a;}
Контрольні запитання
1. Як синтаксично реалізоване перевантаження операцiй?
2. Чи може перевантажена функцiя член мати перший параметр-елемент основного типу?
3. В чому відмінність перевантажених операцій-членів класу та друзів класу ?
4. Як реалізована можливість роботи з різнотипними даними в С++ ?
5. Що таке асоціативний масив і як він утворюється ?
6. Як перегружається оператор виклику функції ?
7. В чому специфіка перегрузки оператора доступу до члена класу ?
8. Чи можна розрізнити постфіксну та інфіксну форми операторів інкремента та декремента під час перегрузки ?
9. Як перевантажуються оператори управління пам’яттю?
10. Де може бути корисним перевантажений оператор присвоювання ?
Завдання 10:
1. Перевантаживши операції < > , написати функцію сортування масиву об’єктів за деякими ознаками його полів :
а) в порядку зростання(спадання) значень одного з полів типу char, int ,float чи double ;
б) в порядку лексикографічної впорядкованості полів типу *char;
в) вважаючи, що клас має два поля p1 та p2 типу double, ввести відношення часткового порядку наступним чином:
a>b якщо a.p1>b.p1 або a.p1==a.p2 && a.p1>b.p2
та впорядкувати масив;
г) ввести відношення часткового порядку,аналогічне п.в), для n елементів, вважаючи, що відповідні поля записані у вигляді масиву
2. Протестувати приклад з класом BrandNew, дописавши конструкції, яких не вистачає для корректної роботи програми.
3. Перевантажити оператор доступу до члена класу так, щоб він повертав об’єкт. Протестувати для цього випадку приклад з класом TAnyClass.
4. Протестувати приклад з класом a_iterator.
5. Перевантажити оператори new-delete для класу Complex так, щоб вони обробляли вимоги у виділенні пам’яті довільного розміру.
6. С++ не перевіряє автоматично під час виконання ситуацію виходу індекса за границю масива. Розробити тип даних масив, який виконує перевірку границь.
7. Написати тип string , що має ряд специфічних властивостей (наприклад, лічильник звернень, перегружені оператори +,-, приведення типу тощо).
8. Реалізувати загальний клас - ітератор списку, який має операції повернення слідуючого елемента, попереднього елемента та голови списку.
9. Розробити тип даних гістограма , перегрузивши оператор індексування масиву для індексації з плаваючими аргументами.
10. Розробити двозв’язний список, реалізація якого використовує лише один зв’язаний вказівник. Включити в розробку ітератор, який може проходити список в будь-якому напрямі.