- •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.2 Перетворення типів.
Операцiї приведення типiв по замовчуванню при роботi з типами , визначеними користувачем, як правило, не працюють. Виняток становить, мабуть, так зване неявне перетворення типів , про яке буде сказано далі. Для
забеспечення роботи з рiзнотипними даними iснує кiлька пiдходiв:
1. використання перевантажених функцiй з рiзними типами параметрiв
friend complex operator + (complex,complex);
friend complex operator + (complex,double);
.
.
.
complex b(2,2),c(3,3);
b=c+20+b;
2. використання конструкторiв, якi виконують вiдповiднi перетворення типiв. Тобто мається на увазі виклик відповідних конструкторів в ситуаціях, коли замість значення деякого типу по синтаксису повинен бути об’єкт.
Розглянемо описаний вище клас Tstr.
В рядках
TStr a="1234";
TStr b="4321";
відбувається, фактично, виклик відповідних конструкторів і потім вже присвоєння екземплярам а та в відповідних “абстрактних” об’єктів . Аналогічні виклики відбуваються і у випадках, коли різнотипні дані зустрічаються в деяких арифметичних виразах.
Приклад:
class complex {
.
.
.
complex (double f) {re=f; im=0;}
...
}
Можна було б написати конструктор і так:
class complex {
.
.
.
complex (double f, double i=0) {re=f, im=i;}
};
Тоді в main()-функції:
complex a(1,2), b(3,4);
a=b+121;
В останньому рядку відбувається неявний виклик конструктора complex(121) і вже потім виконується перевантажена операція додавання для екземплярів класу complex. Якщо конструктор наведеного вище типу не визначений, то можемо в даній ситуації зробити так:
a=operator + (b,complex(double(121),double(0)));
Використання конструкторiв має ряд недолiкiв:
a) виникають складностi з неявним перетворенням типу вiд типу користувача до основного.
b) не може бути неявного перетворення вiд нового типу до старого без змiни старого типу.
3. операцiя перетворення типу
Позначимо через Т-iм'я типу, x-деякий клас, тодi функцiя член
x : : operator Т ();
здiйснює перетворення типу з x в Т. Якщо ми використаємо описаний вище клас Tstr та ініціалізуємо екземпляр класу так:
Tstr myvalye=“1234”;
Тоді рядок long x=myvalue; очевидно, не скомпілюється, оскільки в класі Tstr не передбачено перетворення рядка в довге ціле.
Вихід з даної ситуації - перевантаження операції перетворення типу.
operator long() {return atol (value);}
Можливi неоднозначностi при визначеннi типу.
Приклад :
class x{. . .
x(int);
x(char *); }
class y {. . .
y(int); }
class z {. . .
z(x);
z(y); }
main()
{
z f(1);
// f(x(1)) або f(y(1))-?}
Для оптимiзацiї роботи програми в якостi формальних параметрiв перевантажених операцiй краще використовувати посилання.
class matrix {
double m [300][400];
public:
matrix ();
friend matrix operator + (matrix &,matrix &);
}
