Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

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 &);

}