Объектно-ориентированное программирование на С++ - eDrive

Объектно-ориентированное программирование на С++ - eDrive Объектно-ориентированное программирование на С++ - eDrive

edrive.narod.ru
from edrive.narod.ru More from this publisher
13.01.2015 Views

106 перегружается в бинарный, префиксный – в постфиксный и т.п. Операторы «+», «–», «*», «&» могут быть как бинарными, так и унарными. Перегружаются только опеpатоpы в операциях, для которых по крайней мере один из параметров является членом структуры или класса. С учетом неявного указателя this, при выполнении одноместных операций аргумент может опускаться, а в двухместных операциях допустимо оставлять один аргумент. Для знакомства с перегрузкой одноместных операторов рассмотрим одну из распространенных задач программирования – вывод текущего времени на экран. На основании показаний системных часов компьютера такая программа формирует на экране время в днях, часах и минутах. Чтобы в каждом такте часов не пересчитывать время заново, здесь переопределен оператор инкремента, что позволяет использовать не абсолютный, а относительный отсчет времени: class VClock { private: __int64 total, secs, mins, hours, days; public: VClock (__int64 i); void Out (); VClock operator++ (); }; VClock::VClock (__int64 i) { total = i; secs = total % 60; mins = (total / 60) % 60; hours = (total / 3600) % 24; days = total / 86400L; } void VClock::Out () { ShowMessage (AnsiString (total) + " сек.= " + AnsiString (days) + " дн. " + AnsiString (hours) + " час. " + AnsiString (mins) + " мин. " + AnsiString (secs) + " сек. "); } VClock VClock::operator++ () { VClock temp (++total); secs = temp.secs; mins = temp.mins; hours = temp.hours; days = temp.days; return *this; } void MainVClock () { VClock t1 (59), t2 (172799L);

} ShowMessage ("Старое время:"); t1.Out (); t2.Out (); ++t1; ++t2; ShowMessage ("Новое время:"); t1.Out (); t2.Out (); 107 // 0 дн. 0 час. 0 мин. 59 сек. // 1 дн. 23 час. 59 мин. 59 сек. // 0 дн. 0 час. 1 мин. 0 сек. // 2 дн. 0 час. 0 мин. 0 сек. Следующий пример посвящен операции транспонирования матрицы M[3][3], представленной элементом управления StringGrid1, для выполнения которой перегружается оператор «!»: class VMatr { int i, j; double temp; double M[3][3]; public: VMatr (); void Out (); VMatr operator ! (); }; VMatr::VMatr () { for (i=0; iCells [i][j] ); } void VMatr::Out () { for (i=0; iCells[i][j] = M[i][j]; } VMatr VMatr::operator! () { for (i=0; i

106<br />

перегружается в би<strong>на</strong>рный, префиксный – в постфиксный и т.п. Операторы<br />

«+», «–», «*», «&» могут быть как би<strong>на</strong>рными, так и у<strong>на</strong>рными.<br />

Перегружаются только опеpатоpы в операциях, для которых по крайней<br />

мере один из параметров является членом структуры или класса. С учетом<br />

неявного указателя this, при выполнении одноместных операций аргумент<br />

может опускаться, а в двухместных операциях допустимо оставлять<br />

один аргумент.<br />

Для з<strong>на</strong>комства с перегрузкой одноместных операторов рассмотрим<br />

одну из распространенных задач программирования – вывод текущего времени<br />

<strong>на</strong> экран. На основании показаний системных часов компьютера такая<br />

программа формирует <strong>на</strong> экране время в днях, часах и минутах. Чтобы в каждом<br />

такте часов не пересчитывать время заново, здесь переопределен оператор<br />

инкремента, что позволяет использовать не абсолютный, а относительный<br />

отсчет времени:<br />

class VClock {<br />

private:<br />

__int64 total, secs, mins, hours, days;<br />

public:<br />

VClock (__int64 i);<br />

void Out ();<br />

VClock operator++ ();<br />

};<br />

VClock::VClock (__int64 i) {<br />

total = i; secs = total % 60; mins = (total / 60) % 60;<br />

hours = (total / 3600) % 24; days = total / 86400L;<br />

}<br />

void VClock::Out () {<br />

ShowMessage (AnsiString (total) + " сек.= "<br />

+ AnsiString (days) + " дн. " + AnsiString (hours) + " час. "<br />

+ AnsiString (mins) + " мин. " + AnsiString (secs) + " сек. ");<br />

}<br />

VClock VClock::operator++ () {<br />

VClock temp (++total);<br />

secs = temp.secs; mins = temp.mins; hours = temp.hours;<br />

days = temp.days; return *this;<br />

}<br />

void MainVClock () {<br />

VClock t1 (59), t2 (172799L);

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!