16
взглядами на объектно-ориентированный дизайн. Тем не менее, один конкретный тип наследования —
гомоморфное наследование (homomorphic derivation) — оказывается исключительно полезным в
сочетании со специфическими средствами C++. В гомоморфной иерархии все производные классы
получают свой открытый интерфейс от некоторого базового класса-предка. Как правило, «мать всех
базовых классов» девственно чиста — она не
содержит ни одной переменной, а все ее функции
являются чисто виртуальными. В C++ с этой концепцией ассоциируются многие полезные идиомы
проектирования и программирования.
За концепцией
пространства памяти (memory space) кроется нечто большее, чем обычное управление
памятью. Перегружая в C++ операторы
new
и
delete
, вы определяете, где создаются объекты и как
они уничтожаются. Кроме того, можно создавать абстрактные коллекции, в которых не всегда понятно,
с чем вы имеете дело — с настоящим объектом или с абстракцией. На горизонте уже видны контуры
новых распределенных объектно-ориентированных структур, разработанных такими фирмами, как
Microsoft, Apple и Taligent. Правда, вам придется пересмотреть некоторые базовые представления о
том, где находятся объекты и как они перемещаются в другое место — все эти темы я выделил в
категорию пространств памяти. Пространства памяти позволяют определить
тип объекта во время
выполнения программы — возможность, которой до обидного не хватает в C++. Конечно, мы
поговорим и об управлении памятью, но этим дело не ограничится.
Как читать эту книгу
Перед вами — не руководство с готовыми рецептами для конкретных ситуаций. Скорее это сборник
творческих идей и головоломок. Если к концу книги вы почувствуете, что ваш арсенал приемов
программирования на C++ расширился, значит, я достиг своей цели, а учить вас, когда и как
пользоваться этими приемами, я не стану.
Материал каждой отдельной главы невозможно
в полной мере понять без предварительного знакомства
со всеми остальными главами. И все же я приложил максимум усилий, чтобы материал любой главы
был полезен немедленно после знакомства с ней и чтобы главы логически следовали друг за другом, а
наш воображаемый слон вырисовывался постепенно — бивни, уши, хобот и т. д. После прочтения
книга может пригодиться в качестве справочника — что-то вроде личной и очень краткой
энциклопедии приемов программирования и идиом C++.
За многие годы изучения и использования C++ я узнал, что даже у
опытных программистов в
познаниях встречаются пробелы; в оставшемся материале части я постараюсь выровнять уровень
подготовки всех читателей. Это не вступительное описание языка, а скорее краткая сводка тем,
которые будут использованы в последующих главах. В главе 2 мы стремительно пробежимся по
некоторым особенностям языка. Глава 3 посвящена шаблонам — постепенно эта тема становится все
более важной, поскольку шаблоны поддерживаются во все большем числе компиляторов. В главе 4
рассматривается обработка исключений на основе рекомендованного стандарта ANSI и приводится
пара замечаний о нестандартных исключениях, встречающихся в реальном мире.
Часть 2 посвящена разным типам указателей — от глупых до гениальных. На этом фундаменте
построена вся книга, и я уверен, что эти сведения будут полезны любому читателю.
В части 3 рассматриваются структура и реализация типов и иерархий классов в C++. Основное
внимание уделено одному из частных случаев — гомоморфным иерархиям классов. Заодно мы
поговорим об объектах классов, представителях и других любопытных темах. Большинству читателей
стоит прочитать третью
часть от начала до конца, но никто не запрещает вам просмотреть ее и
отобрать темы по своему вкусу. И хотя вы будете полагать, что знаете об указателях все на свете, они
совершенно неожиданно снова возникнут в контексте гомоморфных иерархий.
В части 4 нас поджидает самая ужасная тема C++ — управление памятью. Уровень изложения
меняется от примитивного до нормального и сверхсложного, но основное внимание уделяется тем
проблемам, которые могут возникнуть при программировании на C++, и их возможным решениям на
базе разных языковых средств. Лично я считаю, что начальные главы этой части абсолютно
необходимы для счастливой и полноценной жизни в C++, но если вас, допустим,
совершенно не
интересует процесс сборки мусора — оставьте последнюю пару глав и займитесь чем-нибудь более
полезным для общества.