Ми вже знаємо, що операція присвоєння = використовується для присвоєння значення змінної певного типу змінній того ж типу, причому це може бути як основний тип, так і тип, визначений користувачем. Але що трапиться, коли з різних сторін знаку = записані змінні різних типів? Насправді це досить складне питання, яким і займемося. Спершу розглянемо, як компілятор виконує перетворення основних типів, яке відбувається автоматично. Потім пояснимо кілька ситуацій, де компілятор не виконує автоматичного перетворення і ми самі повинні визначити його дії. В ці ситуації включені перетворення між основними і визначеними користувачем типами та перетворення між різними типами, визначеними користувачем.
У таких мовах, як Паскаль, здійснені спроби вивільнити розробника від необхідності проробляти подібні перетворення. Однак філософія С++ - це гнучкість, надана можливістю здійснювати всеможливі перетворення.
Перетворення основних типів у основні типи
Коли ми пишемо рядок типу
intvar=floatvar;
де intvar – змінна цілого типу, а floatvar – змінна дійсного типу, то передбачаємо, що компілятор викличе спеціальну функцію для перетворення значення змінної floatvar, яка має формат числа з плаваючою крапкою, в формат цілого числа. Звичайно, існує багато таких перетворень: з float в double, з char у float та інші. Кожне таке перетворення має свою процедуру, вбудовану у компілятор, яка відкривається в залежності від типів змінних, які проставлені з обох сторін знаку =. Ми кажемо, що ці перетворення неявні, оскільки вони не відображаються у лістінгу.
Інколи ми хочемо змусити компілятор перетворити один тип у інший. Далі представлена невеличка програма, де тип float примусово перетворюється в int.
#include <iostream.h>
#include<bios.h>
#include<conio.h>
int main()
{clrscr();
float a=1.62;
int b;
b=(int)a;
cout<<"a="<<a<<" b="<<b;
bioskey(0);
return 0;
}
Перетворення здійснює оператор b=(int)a; у деяких версіях С++ з цією метою передбачений спеціальний оператор static_cast. У цьому випадку ми здійснюємо явне перетворення, але воно використовує ті ж вбудовані процедури, що й неявне.