Перегрузка унарных операторов
Продолжим обсуждение перегрузки операторов демонстрацией того, как можно перегрузить унарные операторы, такие как !, ++, ~ и [ ]. Для этого разработаем класс clock (часы), который можно использовать для хранения значений времени в виде дней, часов, минут и секунд. Разработаем привычные операции для часов.
В файле clock, срр
class clock { public:
clock(unsigned long i);//конструктор и преобразование
void print() const. //отформатированный вывод
void tick(); //добавляет одну секунду
clock operator++(){ tick(); return *this;}
void reset (const clock& c);
friend clock operator +(clock cl, clock c2) ;
clock operator -(clock c) ;
friend clock operator *(unsigned long m, clock c) ;
friend clock operator *(clock c, unsigned long m) ;
private:
unsigned long tot_secs, sees, mins, hours, days;
};
Этот класс перегружает префиксный оператор автоинкремента. Последний является функцией — членом и может быть вызван со своим единственным неявным аргументом. Функция-член tick () прибавляет одну секунду к неявному аргументу перегруженного оператора ++.
inline clock::clock(unsigned long i)
{
tot_secs = i;
secs = tot_secs % 60;
mins = (tot_secs / 60) % 60;
hours = (tot_secs / 3600) % 24;
days = tot_secs / 86400;
}
void clock::tick()
{
clock temp = clock(++tot_secs) ;
sees = temp.secs;
mins = temp.mins;
hours = temp.hours;
days = temp.days;
}
Конструктор выполняет обычные преобразования из tot_sеcs в дни, часы, минуты и секунды. Например, день состоит из
86 400 секунд, следовательно, целое деление на эту константу дает общее число дней. Функция-член tick () создает переменную temp типа clock, которая добавляет одну секунду к общему времени. Конструктор действует как функция преобразования, которая надлежащим образом обновляет время.
Перегруженный operator++() также обновляет неявную переменную типа clock и возвращает обновленное значение. Его можно было бы записать таким же образом, как и tick (), за исключением того, что была бы добавлена инструкция
return temp;
Дополнив программу следующим кодом, можно проверить наши функции:
void clock::print() const
{
cout << days << “ д :” << hours << “ ч :”
<< mins << “ m :” << secs << “ c” << end1;
}
//Часы clock и прогруженные операторы
int main()
{
clock t1(59), t2 (172799); //172799 = 2 дня - 1 сек
cout << “начальное время” << endl;
tl.print() ;
t2.print() ;
++tl; ++t2;
cout << “время через секунду”<< end1;
tl.print();
t2.print() ;
}
Вот что будет выведено:
начальное время
О д : 0 ч : 0 м : 59 с
1 д : 23 ч : 59 м : 59 с
время через секунду
О д :0 ч :1 м : 0 с
2 д : 0 ч : 0 м : 0 с
Можно перегрузить префиксный оператор ++, используя и обычную функцию:
clock operator++(clock& c1)
{
c1.tick();
return c1;
}
Заметьте, что переменная в часах должна увеличиваться на одну секунду. Используется вызов по ссылке.
Выбор между представлением в виде функции-члена или обычной функции (функции-не-члена) обычно зависит от того, допустимо и желательно ли неявное преобразование. Явная передача аргумента допускает его автоматическое приведение, если это необходимо и возможно. Если перегрузка осуществлена функцией-членом, то
++с равнозначно c.operator++()