Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / C++ for real programmers.pdf
Скачиваний:
231
Добавлен:
02.05.2014
Размер:
2.04 Mб
Скачать

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++, но если вас, допустим, совершенно не интересует процесс сборки мусора — оставьте последнюю пару глав и займитесь чем-нибудь более полезным для общества.

17

Несколько слов о стиле программирования

Вот эти несколько слов: стиль программирования меня не волнует. Я достаточно краток? Если хотя бы половина времени, израсходованного на правильную расстановку фигурных скобок, тратилась на обдумывание программы или еще лучше — на общение с пользователями, то вся отрасль работала бы намного эффективнее. Конечно, единство стиля — вещь хорошая, но я еще не видел книги или руководства по стилю, которые бы стоили даже часового собрания группы в начале проекта. К тому же ни одна книга или руководство по стилю не превратят код неаккуратного программиста в нечто осмысленное. В сущности, стиль часто используется как оправдание недостатка внимания к самой программе. Наконец, я еще не видел, чтобы в спорах о стиле один программист в чем-то убедил другого, поэтому любые дискуссии на эту тему считаю бесполезной тратой времени.

У меня есть свои собственные принципы и свой стиль, но в основном я собираюсь отказаться от своего пути и понемногу пользоваться всеми стилями, с которыми мне приходилось встречаться. Книга посвящена языковым идиомам, а не расположению фигурных скобок или регистру символов. Надеюсь, мое решение будет раздражать всех читателей в равной мере.

Я также весьма вольно обошелся с подставляемыми (inline) функциями классов, особенно с виртуальными. В каноническом варианте подставляемые функции должны выглядеть следующим образом:

class Foo { public:

void MemberFn();

};

inline void Foo::MemberFn()

{

...

}

В моей книге этот фрагмент будет выглядеть иначе:

class Foo { public:

void MemberFnO {...};

};

Я оформлял как подставляемые даже виртуальные функции классов, хотя одни компиляторы отвергают такой синтаксис, а другие обрабатывают его неправильно. Делалось это для экономии места. Если бы тексты всех подставляемых функций приводились отдельно, книга заметно выросла бы в размерах, а разрывы страниц чаще приходились на середину листинга. Так что не относитесь к подставляемым функциям слишком серьезно.

Садитесь в любимое кресло, заводите хорошую музыку, ставьте под руку чашку чая и попытайтесь получить удовольствие!