Программирование >>  Структурное программирование 

1 ... 177 178 179 [ 180 ] 181 182 183 ... 342


DATE1.H

Определение класса Date tifndef DATE1 H #define DATE1 H #include <iostream.h>

class Date {

friend ostream &operator (ostream S, const Date & public:

Date(int m = 1, int d = 1,

int у = 1900);

void setDate(int, int, int Date operator++(); Date operator++(int); const Date &operator+=(int

int leapYear (int); int endOfMonth(int); private:

int month; int day; int year;

static int days[ ] ; void helplncrement();

конструктор lie умолчанием ); установка даты

префиксная форма инкремента постфиксная форма инкремента ); добавление дня, изменение объекта

это високосный год? это конец месяца?

массив дней в месяце функция-утилита

#endif

Рис. 8.6. Определение класса Date (часть 1 из 6)

DATE1.CPP

Определения функций-элементов класса Date tinclude <iostream.h> tinclude datel.h

Инициализация статического элемента области действия файл; одна побитовая копия.

int Date::days[] = {О, 31, 28, 31, 30, 31, 30, 31, 31, 30,

31, 30, 31};

Конструктор Date

Date: : Date (int m, int d, int y) { setDate (m, d, y) ; } Установка даты

void Date::setDate(int mm, int dd, int yy) {

month = (mm >= 1 && mm <= 12) ? mm : 1;

year = (yy >= 1900 && yy <= 2100) ? yy : 1900;

if (month == 2 && leapYear(year)) проверка високосного года

day = (dd >= 1 SS dd <= 29) ? dd : 1; else

day = (dd >= 1 && dd <= days[month]) ? dd : 1;

Рис. 8.6. Определения функций-элементов класса Date (часть 2 из 6)



Определение, последний ли день месяца

int Date::endOfMonth(int d)

if (month == 2 && leapYear(year))

return d == 29; последний день февраля в високосном году else

return d == days[month];

Рис. 8.6. Определения функций-элементов класса Date (часть 3 из 6)

Программа драйвер выводит каждый из сконструированных объектов типа Date, используя перегруженную операцию поместить в поток. Перегруженная операция -1-= используется для прибавления 7 дней к d2. Затем используется функция setDate для установки в d3 даты Февраль 28, 1992. Далее, в новом объекте d4 устанавливается дата Март 18, 1969. Затем d4 увеличивается на 1 с помощью перегруженной операции префиксного инкремента. Дата печатается до и после инкрементирования, чтобы удостовериться, что она изменилась правильно. В заключение, d4 инкрементируется перегруженной операцией постфиксного инкремента. Дата печатается до и после инкрементирования, чтобы удостовериться, что она изменилась правильно.

Операция префиксной формы инкремента, перегруженная как функция-элемент. Date Date::operator++() {

helplncrement();

return *this; возвращение значения, a не ссьшки

Операция постфиксной формы инкремента, перегруженная как функция-элемент.

Заметьте, что фиктивный целый параметр не имеет имени. Date Date::operator++(int) {

Date temp = *this; helplncrement();

возвращение не увеличенного, сохраненного, временного объекта return temp; возвращение значения, а не ссьшки

Добавление указанного количества дней к дате const Date sDate::operator+=(int additionalDays) {

for (int 1=1; i <= additionalDays; i++) helplncrement();

return *this; возможность сцепления

Определение, високосный ли год int Date::leapYear(int у) (

if (у % 400 == О I I (у % 100 != О && у % 4 == 0) )

return 1; високосный год

else

return 0; не високосный год



Перегруженная операция вывода данных ostream &operator<< (ostream soutput, const Date &d) {

static char *monthName[13] = { , Январь ,

Февраль , Март , Апрель , Май , Июнь , Июль , Август , Сентябрь , Октябрь , Ноябрь , Декабрь };

output << monthName[d.month] << d.day << , d.year;

return output; возможность сцепления

Рис. 8.6. Определения функций-элементов класса Date (часть 4 из 6)

Перегрузка операции префиксного инкремента очевидна. Программа вызывает функцию утилиту helplncrement для того, чтобы выполнить сам инкремент. Эта функция обеспечивает переходы от конца месяца к началу, когда мы увеличиваем последний день месяца. Эти переходы требуют увеличения месяца. Если месяц уже равен 12, то тогда нужно также увеличить год. функция helplncrement использует функции leapYear и endOflMonth, чтобы правильно увеличить день.

Перегруженная операция префиксного инкремента возвращает копию текущего объекта с измененной датой. Это происходит, потому что текущий объект *this, возвращается как объект класса Date, что активизирует конструктор копии.

Перегрузка операции постфиксного инкремента немного более сложная. Чтобы эмулировать действие постфиксного инкремента, мы должны вернуть неизмененную копию объекта класса Date. При входе в operate-l-+ мы спасаем текущий объект (*this) во временном объекте temp. Затем мы вызываем helplncrement, чтобы инкрементировать объект. В итоге мы возвращаем неизмененную копию объекта в temp. Отметим, что эта функция не может вернуть ссылку на объект класса Date, потому что значение, которое надо вернуть, сохраняется в локальной переменной в определении функции. Локальные переменные уничтожаются, когда функция, в которой они объявлены, завершена. Таким образом, объявление типа, возвращаемого функцией, как Date &, привело бы к ссылке на объект, который после возвращения

Функция помощи инкрементирования даты void Date::helplncrementО {

if (endOfMonth(day) && month == 12) { конец года

day = 1; month = 1; ++year;

else if (endOfMonth(day)) { конец месяца

day = 1; ++month;

else не конец месяца или года; инкремент дня

++day;



1 ... 177 178 179 [ 180 ] 181 182 183 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика