, будут подробно рассмотрены в разделах 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. Когда следует применять перегрузку оператора? Перечислите операторы, которые вы хотели бы перегрузить (укажите причину).
8. Почему открытый интерфейс класса должен быть минимальным?
9. Что изменится, если к объявлению функции-члена добавить ключевое слово
const
?
10. Почему вспомогательные функции лучше всего размещать за пределами класса?
Термины
Упражнения
1. Перечислите разумные операторы для реальных объектов, указанных в разделе 9.1 (например, для тостера).
2. Разработайте и реализуйте класс
Name_pairs
, содержащий пару (имя,возраст), где имя — объект класса
string
, а возраст — переменная типа
double
. Представьте эти члены класса в виде объектов классов
vector<string>
(с именем name ) и
vector<double>
(с именем
age
). Предусмотрите операцию ввода
read_names
, считывающую ряд имен. Предусмотрите операцию
read_ages
, предлагающую пользователю ввести возраст для каждого имени. Предусмотрите операцию
print
, которая выводит на печать пары (
name[i]
,
age[i]
) (по одной на строке) в порядке, определенном вектором name. Предусмотрите операцию
sort
, упорядочивающую вектор
name
в алфавитном порядке и сортирующую вектор
age
соответствующим образом. Реализуйте все “операции” как функции-члены. Проверьте этот класс (конечно, проверять надо как можно раньше и чаще).