Преобразование к базовому типу данных
В качестве примера рассмотрим неявное преобразование объекта класса dat к базовым типам данных int и long . Сущность его заключается в вычислении полного количества дней в дате, заданной входным объектом (long) и количества дней в текущем году в этой же дате (int). Для задания этих операции необходимо переопределить в классе dat одноименные операции int и long . Переопределяемые операции задаются соответствующими функциями-элементами без параметров. Тип результата совпадает с базовым типом, к которому осуществляется приведение и поэтому не указывается:
//------------------------------------------------------bk73-07.cpp
//------Преобразование к базовым типам данных
#include <stdio.h>
static int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
class dat
{
int day,month,year;
public:
operator int(); // Преобразование dat в int
operator long(); // Преобразование dat в long
long operator -(dat &p); // Операция dat-dat вычисляет
dat(); // разность дат в днях
dat(char *);
};
//------ Преобразование dat в int -------------------------
dat::operator int()
{
int r; // Текущий результат
int i; // Счетчик месяцев
for (r=0, i=1; i<month; i++) // Число дней в прошедших
r += days[month]; // месяцах
if ((month> 2) && (year%4==0)) r++; // Високосный год
r += day; // Дней в текущем месяце
return(r);
}
//------ Преобразование dat в long ------------------------
dat::operator long()
{
long r; // Текущий результат
r = 365 * (year-1); // Дней в предыдущих полных годах
r += year / 4; // Високосные года
r += (int)(*this); // Дней в текущем году- предыдущая
return(r); // операция (явное преобразование dat в int)
}
//-------- Операция вычисления разницы двух дат -----------
long dat::operator-(dat& p)
{
return((long)(*this) - (long)p); // Преобразовать оба объекта
} // к типу long и вычислить разность
void main()
{
dat a("12-05-1990"); // Дата, заданная строкой
dat b; // Текущая дата
int c;
long d; // Явное преобразование к long
cout << "С 12-05-1990 прошло" << (long)b-(long)a << "дней\n";
// Явное преобразование к int
cout << "В этом году прошло " << (int)b << " дней\n";
c = b; // Неявное преобразование при присваивании
d = b - a; // Операция dat-dat
printf("С 12-05-1990 прошло %4ld дней\n",d);
printf("В этом году прошло %3d дней\n",c);
}