Объектно-ориентированное программирование на С++ - 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

}<br />

ShowMessage ("Старое время:");<br />

t1.Out ();<br />

t2.Out ();<br />

++t1; ++t2;<br />

ShowMessage ("Новое время:");<br />

t1.Out ();<br />

t2.Out ();<br />

107<br />

// 0 дн. 0 час. 0 мин. 59 сек.<br />

// 1 дн. 23 час. 59 мин. 59 сек.<br />

// 0 дн. 0 час. 1 мин. 0 сек.<br />

// 2 дн. 0 час. 0 мин. 0 сек.<br />

Следующий пример посвящен операции транспонирования матрицы<br />

M[3][3], представленной элементом управления StringGrid1, для выполнения<br />

которой перегружается оператор «!»:<br />

class VMatr {<br />

int i, j;<br />

double temp;<br />

double M[3][3];<br />

public:<br />

VMatr ();<br />

void Out ();<br />

VMatr operator ! ();<br />

};<br />

VMatr::VMatr () {<br />

for (i=0; iCells [i][j] );<br />

}<br />

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

for (i=0; iCells[i][j] = M[i][j];<br />

}<br />

VMatr VMatr::operator! () {<br />

for (i=0; i

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

Saved successfully!

Ooh no, something went wrong!