Программирование. Принципы и практика использования C++ Исправленное издание, стр. 137
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Задание
Это задание сводится к запуску последовательности версий класса
DateDatetodayDatetodayadd_day()todaytomorrow<<Проверка корректности даты может быть очень простой. В любом случае не допускайте, чтобы месяц выходил за пределы диапазона [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. Какие ограничения и проблемы, связанные со структурой
Date4. Почему в классе
Dateinit_day()5. Что такое инвариант? Приведите примеры.
6. Когда функции следует размещать в определении класса, а когда — за его пределами? Почему?
7. Когда следует применять перегрузку оператора? Перечислите операторы, которые вы хотели бы перегрузить (укажите причину).
8. Почему открытый интерфейс класса должен быть минимальным?
9. Что изменится, если к объявлению функции-члена добавить ключевое слово
const10. Почему вспомогательные функции лучше всего размещать за пределами класса?
Термины

Упражнения
1. Перечислите разумные операторы для реальных объектов, указанных в разделе 9.1 (например, для тостера).
2. Разработайте и реализуйте класс
Name_pairsstringdoublevector<string>vector<double>ageread_names()read_ages()print()name[i]age[i]sort()nameage3. Замените функцию
Name_pair::print()operator<<==!=Name_pair4. Посмотрите на головоломный пример из раздела 8.4. Вставьте его в программу и объясните смысл каждой конструкции. Обратите внимание на то, что этот код не делает никаких осмысленных операций; он используется только для усложнения примера.
5. Для выполнения этого и нескольких следующих упражнений необходимо разработать и реализовать класс
BookBookBook;n-n-n-xnx6. Добавьте операторы в класс
Book==!=<<7. Создайте перечисление для класса
BookGenreBook