Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
16.04.2013
Размер:
64.51 Кб
Скачать

Перегрузка унарных операторов

Продолжим обсуждение перегрузки операторов демонстрацией того, как можно пе­регрузить унарные операторы, такие как !, ++, ~ и [ ]. Для этого разработаем класс 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++()

Соседние файлы в папке Тельминов (мб)