Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

return true;

}

bool leapyear(int y)

{

// см. упражнение 10

}

bool operator==(const Date& a, const Date& b)

{

return a.year==b.year

&& a.month==b.month

&& a.day==b.day;

}

bool operator!=(const Date& a, const Date& b)

{

return !(a==b);

}

ostream& operator<<(ostream& os, const Date& d)

{

return os << '(' << d.year

<< ',' << d.month

<< ',' << d.day << ')';

}

istream& operator>>(istream& is, Date& dd)

{

int y, m, d;

char ch1, ch2, ch3, ch4;

is >> ch1 >> y >> ch2 >> m >> ch3 >> d >> ch4;

if (!is) return is;

if (ch1!='(' || ch2!=',' || ch3!=',' || ch4!=')') { // ошибка
формата

is.clear(ios_base::failbit); // установлен неправильный
бит

return is;

}

dd = Date(y, Date::Month(m),d); // обновляем dd

return is;

}

enum Day {

sunday, monday, tuesday, wednesday, thursday, friday, saturday

};

Day day_of_week(const Date& d)

{

// ...

}

Date next_Sunday(const Date& d)

{

// ...

}

Date next_weekday(const Date& d)

{

// ...

}

} // Chrono

Функции, реализующие операции

>>
и
<<
для класса
Date
, будут подробно рассмотрены в разделах 10.7 и 10.8.

Задание

Это задание сводится к запуску последовательности версий класса

Date
. Для каждой версии определите объект класса
Date
с именем
today
, инициализированный датой 25 июня 1978 года. Затем определите объект класса
Date
с именем tomorrow и присвойте ему значение, скопировав в него объект
today
и увеличив его день на единицу с помощью функции
add_day
. Выведите на печать объекты
today
и
tomorrow
, используя оператор
<<
, определенный так, как показано в разделе 9.8.

Проверка корректности даты может быть очень простой. В любом случае не допускайте, чтобы месяц выходил за пределы диапазона [1,12], а день месяца — за пределы диапазона [1,31]. Проверьте каждую версию хотя бы на одной некорректной дате, например (2009, 13, –5).

1. Версия из раздела 9.4.1.

2. Версия из раздела 9.4.2.

3. Версия из раздела 9.4.3.

4. Версия из раздела 9.7.1.

5. Версия из раздела 9.7.4.

Контрольные вопросы

1. Какие две части класса описаны в главе?

2. В чем заключается разница между интерфейсом и реализацией класса?

3. Какие ограничения и проблемы, связанные со структурой

Date
, описаны в этой главе?

4. Почему в классе

Date
используется конструктор, а не функция
init_day
?

5. Что такое инвариант? Приведите примеры.

6. Когда функции следует размещать в определении класса, а когда — за его пределами? Почему?

7. Когда следует применять перегрузку оператора? Перечислите операторы, которые вы хотели бы перегрузить (укажите причину).

  • Читать дальше
  • 1
  • ...
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: