Большую часть этой (и следующей) главы можно было бы вынести в приложение. Однако в части II нам потребуются многие средства, описанные здесь. Кроме того, очень скоро мы столкнемся с проблемами, для решения которых эти средства были изобретены. При написании простых программ вы неизбежно должны будете решать такие проблемы. Итак, для того чтобы сэкономить время и минимизировать недоразумения, необходим систематический подход, а не серия “случайных” ссылок на справочное руководство и приложения.
Глава 9. Технические детали: классы и прочее
“Помните, все требует времени”.
Пит Хейн (Piet Hein)
В этой главе мы сосредоточим внимание на основном инструменте программирования: языке С++. Мы опишем технические подробности этого языка, связанные в основном с типами, определенными пользователем, иначе говоря, с классами и перечислениями. Описание свойств языка излагается на примере постепенной разработки типа Date
. Кроме того, это позволяет продемонстрировать некоторые полезные приемы разработки классов.
9.1. Типы, определенные пользователем
char
, int
и double
(подробнее они описаны в разделе A.8). Тип называется встроенным, если компилятор знает, как представить объекты такого типа и какие операторы к нему можно применять (такие как +
и –
) без уточнений в виде объявлений, которые создает программист в исходном коде.
string
, vector
и ostream
, описанные в главе 10), или типами, самостоятельно созданными программистом, как классы Token
и Token_stream
(см. разделы 6.5 и 6.6). Как только мы освоим необходимые технические детали, мы создадим графические типы, такие как Shape
, Line
и Text
(речь о них пойдет в главе 13). Стандартные библиотечные типы являются такой же частью языка, как и встроенные типы, но мы все же рассматриваем их как определенные пользователем, поскольку они созданы из таких же элементарных конструкций и с помощью тех же приемов, как и типы, разработанные нами; разработчики стандартных библиотек не имеют особых привилегий и средств, которых нет у нас. Как и встроенные типы, большинство типов, определенных пользователем, описывают операции. Например, класс vector
содержит операции []
и size()
(см. разделы 4.6.1 и В.4.8), класс ostream
операцию <<
, класс Token_stream
операцию get()
(см. раздел 6.8), а класс Shape
операции add(Point)
и set_color()
(см. раздел 14.2).
int;
когда хотим манипулировать текстом, класс string
— хороший выбор; когда хотим манипулировать входной информацией для калькулятора, нам нужны классы Token
и Token_stream
. Необходимость этих классов имеет два аспекта.
•
•
Эту концепцию, лежащую в основе многих идей, можно выразить так: “нечто” имеет данные для представления своего текущего значения, — которое иногда называют
Итак, мы хотим выразить “идею” или “понятие” в коде в виде структуры данных и набора функций. Возникает вопрос: “Как именно?” Ответ на этот вопрос изложен в данной главе, содержащей технические детали этого процесса в языке С++.