Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ

Покупка
Артикул: 616180.01.99
К покупке доступен более свежий выпуск Перейти
Эта книга представляет собой перевод третьего издания американского бестселлера Effective C++ и является руководством по грамотному использованию языка C++. Она поможет сделать ваши программы более понятными, простыми в сопровождении и эффективными. Помимо материала, описывающего общую стратегию проектирования, книга включает в себя главы по программированию с применением шаблонов и по управлению ресурсами, а также множество советов, которые позволят усовершенствовать ваши программы и сделать работу более интересной и творческой. Книга также включает новый материал по принципам обработки исключений, паттернам проектирования и библиотечным средствам. Издание ориентировано на программистов, знакомых с основами C++ и имеющих навыки его практического применения.
Мэйерс, С. Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ [Электронный ресурс] / С. Мэйерс. - Москва : ДМК Пресс, 2008. - 300 с.: ил. - ISBN 5-94074-304-8. - Текст : электронный. - URL: https://znanium.com/catalog/product/409179 (дата обращения: 20.04.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Отзывы о третьей редакции
Эффективного использования C++

Книга Скотта Мейерса «Эффективное использование C++», третья редакция –
это концентрация опыта программирования – того опыта, который без нее достался бы вам дорогой ценой. Эта книга – великолепный источник, который я рекомендую всем, кто пишет на C++ профессионально.
Питер Дулимов, ME, инженер,
подразделение оценки и исследований NAVSYSCOM, Австралия

Третья редакция остается лучшей книгой, посвященной тому, как сложить вместе все части C++ для создания эффективных и внутренне целостных программ. Если
вы претендуете на то, чтобы быть программистом C++, то должны ее прочитать.
Эрик Наглер, консультант, преподаватель и автор «Изучая C++»

Первая редакция этой книги была одной из небольшого (весьма небольшого)
числа книг, благодаря которым я ощутимо повысил свой уровень как профессионального разработчика программного обеспечения. Как и другие книги из этого
ряда, она оказалась практичной и легкой для чтения, но при этом содержала множество важных советов. «Эффективное использование C++», третья редакция, продолжает эту традицию. C++ – очень мощный язык программирования. Если C дает
веревку, по которой можно забраться на вершину горы, то C++ – это целый магазин, в котором самые разные люди готовы помочь вам завязать на этой веревке узлы.
Овладение материалом, приведенным в этой книге, определенно повысит вашу
способность эффективно использовать C++ и не умереть при этом от напряжения.
Джек В. Ривес, исполнительный директор Bleading Edge Software Technologies

Каждый новый разработчик, который приходит в мою команду, сразу получает задание – прочесть эту книгу.
Майкл Ланцетта, ведущий инженер по программному обеспечению

Я прочитал первую редакцию «Эффективного использования C++» около
9 лет назад, и эта книга сразу стала одной из моих любимых книг по C++. На мой
взгляд, третье издание «Эффективного использования C++» остается обязательным к прочтению для всех, кто желает эффективно программировать на C++. Мы
будем жить в лучшем мире, если программисты C++ прочтут эту книгу прежде,
чем написать первую строку профессионального кода.
Дэнни Раббани, инженер по программному обеспечению

Первое издание «Эффективного использования C++» Скотта Мейерса попалось мне, когда я был рядовым программистом и напряженно старался как можно
лучше выполнить порученную работу. И это было спасением! Я обнаружил, что
советы Мейерса практически полезны и эффективны, что они на 100% реализуют
то, что обещают. Третья редакция помогает в практическом применении C++ при
работе над современными серьезными программными проектами, предоставляя
информацию о самых новых средствах и возможностях языка. Я с удовольствием
обнаружил, что могу найти много нового и интересного для себя в третьем издании книги, которую, как мне казалось, знаю очень хорошо.
Майкл Топик, технический программный менеджер

Это авторитетное руководство от Скотта Мейерса, гуру C++, предназначенное для каждого, кто хочет применять C++ безопасно и эффективно, или же переходит к C++ от любого другого объектноориентированного языка. Эта книга
содержит ценную информацию, изложенную в ясном, сжатом, занимательном и
проницательном стиле.
Сиддхартха Каран Сингх, разработчик программного обеспечения

Скотт Мэйерс

ЭффективноеиспользованиеС++

Scott Meyers

Effective C++

Third Edition

55 Specific Ways to Improve Your Programs and Designs

ADDISONWESLEY

Upper Saddle River, NJ • Boston • Indianapolis • San Francisco
New York • Toronto • Montreal • London • Munich • Paris • Madrid
Capetown • Sydney • Tokyo • Singapore • Mexico City

Скотт Мэйерс

Эффективное

использование C++

Москва

Третье издание

55 верных советов улучшить

структуру и код ваших программ

УДК 004.4
ББК 32.973.26018.2

М97

Мэйерс С.

М97
Эффективное использование C++. 55 верных способов улучшить структуру
и код ваших прграмм – М.: ДМК Пресс. – 300 с.: ил.

ISBN 5940743048

Эта книга представляет собой перевод третьего издания американского

бестселлера Effective C++ и является руководством по грамотному использованию языка C++. Она поможет сделать ваши программы более понятными, простыми в сопровождении и эффективными. Помимо материала, описывающего общую стратегию проектирования, книга включает в себя главы
по программированию с применением шаблонов и по управлению ресурсами, а также множество советов, которые позволят усовершенствовать ваши
программы и сделать работу более интересной и творческой. Книга также
включает новый материал по принципам обработки исключений, паттернам
проектирования и библиотечным средствам.

Издание ориентировано на программистов, знакомых с основами C++ и

имеющих навыки его практического применения.

УДК 004.4
ББК 32.973.26018.2

Original Eglish language edition publihed by Pearson Education, Inc. Copyright © 2005 by Pearson

Education, Inc. All rights reserved.

Все права защищены. Любая часть этой книги не может быть воспроизведена в какой

бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.

Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность

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

ISBN 0321334876 (англ.)
© Pearson Education, Inc.

ISBN 5984533048 (АйТи)
© Перевод на русский язык, оформление,
© издание. ДМКПресс

Содержание

Благодарности ............................................................................. 11

Предисловие ................................................................................ 15

Введение....................................................................................... 17

Терминология............................................................................. 18
Соглашения об именах ............................................................... 23
Многопоточность........................................................................ 24
Библиотеки TR1 и Boost.............................................................. 24

Глава 1. Приучайтесь к C++ ..................................................... 26

Правило 1: Относитесь к C++ как к конгломерату языков ........... 26
Правило 2: Предпочитайте const, enum и inline
использованию #define .............................................................. 28
Правило 3: Везде, где только можно, используйте const ............ 31
Константные функциичлены ..................................................... 33
Как избежать дублирования в константных и неконстантных
функцияхчленах ...................................................................... 37
Правило 4: Прежде чем использовать объекты, убедитесь,
что они инициализированы ........................................................ 40

Глава 2. Конструкторы, деструкторы
и операторы присваивания ..................................................... 47

Правило 5: Какие функции C++ создает и вызывает молча ......... 47
Правило 6: Явно запрещайте компилфятору генерировать
функции, которые вам не нужны ................................................. 50
Правило 7: Объявляйте деструкторы виртуальными
в полиморфном базовом классе ................................................. 52
Правило 8: Не позволяйте исключениям покидать деструкторы .... 56
Правило 9: Никогда не вызывайте виртуальные функции
в конструкторе или деструкторе ................................................. 60

Содержание
Содержание
Содержание
Содержание
Содержание

Правило 10: Операторы присваивания должны возвращать
ссылку на *this ............................................................................ 64
Правило 11: В operator= осуществляйте проверку
на присваивание самому себе .................................................... 65
Правило 12: Копируйте все части объекта .................................. 68

Глава 3. Управление ресурсами ............................................ 72

Правило 13: Используйте объекты для управления ресурсами .... 72
Правило 14: Тщательно продумывайте поведение
при копировании классов, управляющих ресурсами .................. 76
Правило 15: Предоставляйте доступ к самим ресурсам
из управляющих ими классов ..................................................... 79
Правило 16: Используйте одинаковые формы new и delete ........ 83
Правило 17: Помещение в «интеллектуальный» указатель
объекта, выделенного с помощью new, лучше располагать
в отдельном предложении .......................................................... 85

Глава 4. Проектирование программ и объявления ............ 87

Правило 18: Проектируйте интерфейсы так, что их легко было
использовать правильно и трудно – неправильно....................... 87
Правило 19: Рассматривайте проектирование класса
как проектирование типа ............................................................ 92
Правило 20: Предпочитайте передачу по ссылке на const
передаче по значению ................................................................ 94
Правило 21: Не пытайтесь вернуть ссылку, когда должны
вернуть объект ........................................................................... 98
Правило 22: Объявляйте данныечлены закрытыми ................. 102
Правило 23: Предпочитайте функциямчленам функции,
не являющиеся ни членами, ни друзьями класса ...................... 105
Правило 24: Объявляйте функции, не являющиеся членами,
когда преобразование типов должно быть применимо
ко всем параметрам ................................................................. 109
Правило 25: Подумайте о поддержке функции swap,
не возбуждающей исключений ................................................. 112

Глава 5. Реализация ............................................................... 119

Правило 26: Откладывайте определение переменных
насколько возможно ................................................................. 119
Правило 27: Не злоупотребляйте приведением типов .............. 122

Содержание
Содержание
Содержание
Содержание
Содержание

Правило 28: Избегайте возвращения «дескрипторов»
внутренних данных ................................................................... 128
Правило 29: Стремитесь, чтобы программа была безопасна
относительно исключений ........................................................ 132
Правило 30: Тщательно обдумывайте использование
встроенных функций................................................................. 139
Правило 31: Уменьшайте зависимости файлов
при компиляции ....................................................................... 144

Глава 6. Наследование и объектноориентированное
проектирование ....................................................................... 153

Правило 32: Используйте открытое наследование
для моделирования отношения «является» .............................. 153
Правило 33: Не скрывайте унаследованные имена................... 159
Правило 34: Различайте наследование интерфейса
и наследование реализации ..................................................... 164
Правило 35: Рассмотрите альтернативы виртуальным
функциям ................................................................................. 171
Реализация паттерна «Шаблонный метод» с помощью идиомы
невиртуального интерфейса .................................................... 172
Реализация паттерна «Стратегия» посредством указателей
на функции............................................................................. 173
Реализация паттерна «Стратегия» посредством класса tr::function .. 175
«Классический» паттерн «Стратегия» ........................................ 177
Резюме.................................................................................. 178
Правило 36: Никогда не переопределяйте наследуемые
невиртуальные функции ........................................................... 179
Правило 37: Никогда не переопределяйте наследуемое
значение аргумента функции по умолчанию ............................. 181
Правило 38: Моделируйте отношение «содержит» или
«реализуется посредством» с помощью композиции ............... 185
Правило 39: Продумывайте подход к использованию
закрытого наследования .......................................................... 188
Правило 40: Продумывайте подход к использованию
множественного наследования ................................................ 193

Глава 7. Шаблоны и обобщенное программирование ..... 200

Правило 41: Разберитесь в том, что такое неявные
интерфейсы и полиморфизм на этапе компиляции .................. 200

10
10
10
10
Содержание
Содержание
Содержание
Содержание
Содержание

Правило 42: Усвойте оба значения ключевого слова typename ... 204
Правило 43: Необходимо знать, как обращаться к именам
в шаблонных базовых классах .................................................. 207
Правило 44: Размещайте независимый от параметров код
вне шаблонов ........................................................................... 212
Правило 45: Разрабатывайте шаблоны функцийчленов так,
чтобы они принимали «все совместимые типы» ....................... 217
Правило 46: Определяйте внутри шаблонов функции,
не являющиеся членами, когда желательны преобразования
типа .......................................................................................... 221
Правило 47: Используйте классыхарактеристики
для предоставления информации о типах ................................ 225
Правило 48: Изучите метапрограммирование шаблонов ......... 231

Глава 8. Настройка new и delete ........................................... 237

Правило 49: Разберитесь в поведении обработчика new .......... 238
Правило 50: Когда имеет смысл заменять new и delete ............ 244
Правило 51: Придерживайтесь принятых соглашений
при написании new и delete ...................................................... 249
Правило 52: Если вы написали оператор new с размещением,
напишите и соответствующий оператор delete......................... 252

Глава 9. Разное ........................................................................ 258

Правило 53: Обращайте внимание на предупреждения
компилятора ............................................................................. 258
Правило 54: Ознакомьтесь со стандартной библиотекой,
включая TR1 ............................................................................. 259
Правило 55: Познакомьтесь с Boost ......................................... 264

Приложение А. За пределами «Эффективного
использования C++» ................................................................. 268

Приложение В. Соответствие правил во втором и третьем
изданиях .................................................................................... 272

Благодарности

Книга «Эффективное использование C++» существует уже 15 лет, а изучать C++
я начал примерно за 5 лет до того, как написал ее. Таким образом, работа над этим
проектом ведется около 20 лет. За это время я получал пожелания, замечания,
исправления, а иногда и ошеломляющие наблюдения от сотен (тысяч?) людей.
Каждый из них помог развитию «Эффективного использования C++». Я благодарен им всем.
Я давно уже отказался от попыток запомнить, где и чему я научился сам, но
один источник не могу не упомянуть, поскольку пользуюсь им постоянно. Это
группы новостей Usenet, в особенности comp.lang.c++.moderated и comp.std.c++.
Многие правила, приведенные в этой книге (возможно, большинство), появились
как результат осмысления технических идей, обсуждавшихся в этих группах.
В отборе нового материала, вошедшего в третье издание книги, мне помогал Стив Дьюхэрст (Steve Dewhurst). В правиле 11 идея реализации оператора operator= путем копирования и обмена почерпнута из заметок Герба Саттера
(Herb Sutter), а именно из задачи 13 его книги «Exceptional C++» (AddisonWesley,
2000)1. Идея о захвате ресурса как инициализации (правило 13) заимствована из
книги «Язык программирования C++» («The C++ Programming Language», AddisonWesley, 2002) Бьярна Страуструпа. Идея правила 17 взята из раздела «Передовые
методы» («Best practices») на сайте «Boost shared_ptr» (http:// boost.org/libs/
smart_ptr/shared_ptr.htm#BestPractices) и уточнена на основе материала задачи
21 из книги Herb Sutter «More exceptional C++» (AddisonWesley, 2002). На правило 29 меня вдохновило развернутое исследование этой темы, предпринятое
Гербом Саттером, в задачах 8–19 из книги «Exceptional C++», а также в задачах
17–23 из «More exceptional C++» и задачах 11–13 из его же книги Exceptional
C++ Style» (AddisonWesley, 2005). Дэвид Абрахамс (David Abrahams) помог мне
лучше понять три принципа гарантирования безопасности исключений. Идиома
невиртуального интерфейса (NVI) в правиле 35 взята из колонки Герба Саттера
«Виртуальность» (Virtuality) в сентябрьском номере 2001 г.  журнала «C/C++ Users
Journal». Упомянутые в том же правиле паттерны проектирования «Шаблонный
метод» (Template Method) и «Стратегия» взяты из книги «Design Patterns»2

(AddisonWesley, 1995) Эриха Гамма (Erich Gamma), Ричарда Хелма (Richard
Helm), Ральфа Джонсона (Ralf Johnson) и Джона Влиссидеса (John Vlissides).
Идею применения идиомы NVI в правиле 37 подсказал Хендрик Шобер (Hend1 Имеется русский перевод: Саттер Герб. Решение сложных задач на C++. Издательский дом «Вильямс», 2002 (Прим. науч. ред.).
2 Имеется русский перевод: Паттерны проектирования. СПб.: Питер (Прим. науч.
ред.).

12
12
12
12
Благодарности
Благодарности
Благодарности
Благодарности
Благодарности

rik Schober). Вклад Дэвида Смаллберга (David Smallberg) – реализация множества, описанная в правиле 38. Сделанное в правиле 39 наблюдение о том, что оптимизация пустого базового класса в принципе невозможна при множественном
наследовании, заимствовано из книги Дэвида Вандевурде (David Vandevoorde) и
Николая М. Джоссутиса (Nickolai M. Josuttis) «Templates C++» («Шаблоны
в языке C++») (AddisonWesley, 2003). Изложенное в правиле 42 мое первоначальное представление о том, для чего нужно ключевое слово typename, основано на
документе «Часто задаваемые вопросы о C++ и C» («C++ and C FAQ») (http://
www.comeaucomputing.com/techtalk/#typename), который поддерживает Грег Комо
(Greg Comeau), а Леор Золман (Leor Zolman) помог мне осознать, что это представление ошибочно (моя вина, а не Грега). Тема правила 46 возникла из речи
Дэна Сакса (Dan Saks) «Как заводить новых друзей». Высказанная в конце правила 52 идея о том, что если вы объявляете одну версию оператора new, то должны объявлять и все остальные, изложена в задаче 22 книги «Exceptional C++»
Герба Саттера. Мое понимание процесса рецензирования Boost (суммированное
в правиле 55) было уточнено Дэвидом Абрахамсом.
Все вышесказанное касается того, где и от кого чемуто научился именно я, независимо от того, кто первым опубликовал материал на соответствующую тему.
В моих заметках также сказано, что я использовал информацию, полученную
от Стива Клемеджа (Steve Clamage), Антона Тракса (Antoine Trux), Тимоти Кнокса (Timothy Knox) и Майка Коэлблинга (Mike Kaelbling), хотя, к сожалению, не
уточняется – где и как.
Черновики первого издания просматривали Том Карджилл (Tom Cargill),
Гленн Каролл (Glenn Caroll), Тони Дэвис (Tony Davis), Брайн Керниган (Brian
Kernigan), Жак Кирман (Jak Kirman), Дуг Ли (Doug Lea), Моисей Лежтер
(Moises Lejter), Юджин Сантос мл. (Eugene Santos, Jr), Джон Шевчук (John
Shewchuk), Джон Стаско (John Stasko), Бьерн Страуструп (Bjarne Stroustrup),
Барбара Тилли (Barbara Tilly) и Нэнси Л. Урбано (Nancy L. Urbano). Кроме того,
пожелания относительно улучшений, которые были включены в более поздние
переиздания, высказывали Нэнси Л. Урбано, Крис Трейчел (Chris Treichel), Дэвид Корбин (David Corbin), Пол Гибсон (Paul Gibson), Стив Виноски (Steve
Vinoski), Том Карджилл (Tom Cargill), Нейл Родес (Neil Rhodes), Дэвид Берн
(David Bern), Расс Вильямс (Russ Williams), Роберт Бразил (Robert Brazile), Дуг
Морган (Doug Morgan), Уве Штейнмюллер (Uwe Steinmuller), Марк Сомер
(Mark Somer), Дуг Мур (Doug Moore), Дэвид Смаллберг, Сейт Мельтцер (Seith
Meltzer), Олег Штейнбук (Oleg Steinbuk), Давид Папурт (David Papurt), Тони
Хэнсен (Tony Hansen), Питер МакКлуски (Peter McCluskey), Стефан Кухлинс
(Stefan Kuhlins), Дэвид Браунегг (David Braunegg), Поль Чисхолм (Paul
Chisholm), Адам Зелл (Adam Zell), Кловис Тондо, Майк Коэлблинг, Натраж
Кини (Natraj Kini), Ларс Ньюман (Lars Numan), Грег Лутц (Greg Lutz), Тим
Джонсон, Джон Лакос (John Lakos), Роджер Скотт (Roger Scott), Скотт Фроман
(Scott Frohman), Алан Рукс (Alan Rooks), Роберт Пур (Robert Poor), Эрик Наглер (Eric Nagler), Антон Тракс, Кад Роукс (Cade Roux), Чандрика Гокул
(Chandrika Gokul), Рэнди Мангоба (Randy Mangoba) и Гленн Тейтельбаум
(Glenn Teitelbaum).

13
13
13
13

Черновики второго издания проверяли: Дерек Босх (Derek Bosch), Тим
Джонсон (Tim Johnson), Брайн Керниган, Юничи Кимура (Junichi Kimura),
Скотт Левандовски (Scott Lewandowski), Лаура Михаелс (Laura Michaels), Дэвид Смаллберг (David Smallberg), Кловис Тонадо (Clovis Tonado), Крис Ван Вик
(Chris Van Wyk) и Олег Заблуда (Oleg Zabluda). Более поздние тиражи выиграли
от комментариев Дэниела Штейнберга (Daniel Steinberg), Арунпрасад Марате
(Arunprasad Marathe), Дуга Стаппа (Doug Stapp), Роберта Халла (Robert Hall),
Черилла Фергюссона (Cheryl Ferguson), Гари Бартлетта (Gary Bartlett), Майкла
Тамма (Michael Tamm), Кендалла Бимана (Kendall Beaman), Эрика Наглера,
Макса Хайлперина (Max Hailperin), Джо Готтмана (Joe Gottman), Ричарда Викса
(Richard Weeks), Валентина Боннарда (Valentin Bonnard), Юн Хи (Jun He), Тима
Кинга (Tim King), Дона Майлера (Don Mailer), Теда Хилла (Ted Hill), Марка
Харрисона (Marc Harrison), Майкла Рубинштейна (Michael Rubinstein), Марка
Роджерса (Marc Rodgers), Дэвида Го (David Goh), Брентона Купера (Brenton
Cooper), Энди ТомасаКрамера (Andy ThomasCramer), Антона Тракса, Джона
Вальта (John Walt), Брайана Шарона (Brian Sharon), Лиам Фитцпатрик (Liam
Fitzpatric), Бернда Мора (Bernd Mohr), Гарри Йи (Gary Yee), Джона О’Ханли
(John O’Hanley), Бреди Патресона (Brady Paterson), Кристофера Петерсона
(Christopher Peterson), Феликса Клузняка (Feliks Kluzniak, Изи Даниетц (Isi
Dunetz), Кристофера Креутци (Christopher Creutzi), Яна Купера (Ian Cooper),
Карла Харриса (Carl Harris), Марка Стикеля (Marc Stickel), Клея Будина (Clay
Budin), Панайотиса Мацинопулоса (Panayotis Matsinopulos), Дэвида Смаллберга, Херба Саттера, Пажо Мисленцевича (Pajo Misljencevic), Джулио Агостини
(Giulio Agostini), Фредерика Бломквиста (Fredrik Blonqvist), Джимми Снайдера
(Jimmy Snyder), Бириал Дженсен (Byrial Jensen), Витольда Кузьминского
(Witold Kuzminski), Казунобу Курияма (Kazunobu Kuriyama), Майкла Кристенсена (Michael Christensen), Йорга Янеза Теруела ( Jorge Yanez Teruel), Марка Дэвиса (Mark Davis), Марти Рабиновича (Marty Rabinowitz), Арес Лага (Ares Lagae)
и Александра Медведева.
Ранние частичные черновики настоящего издания просматривали: Брайан
Керниган, Анжелика Ланджер, Джесси Лачли, Роджер П. Педерсен, Крис Ван
Вик, Николас Страуструп и Хендрик Шобер. Просмотр полного текста черновика осуществляли: Леор Золман, Майк Тсао, Эрик Наглер, Жене Гутник, Дэвид
Абрахамс, Герхард Креузер, Дросос Коуронис, Брайан Керниган, Эндрю Кримс,
Балог Пал, Эмили Джагдхар, Евгений Каленкович, Майк Роз, Энрико Каррара,
Бенджамен Берк, Джек Ривз, Стив Шириппа, Мартин Фалленстедт, Тимоти
Кнокс, Юн Баи, Майкл Ланцетта, Филип Джанерт, Джудо Бартолуччи, Майкл
Топик, Джефф Шерпельтц, Крис Наурот, Нишант Миттал, Джефф Соммерс, Хал
Морофф, Винсент Манис, Брендон Чанг, Грег Ли, Джим Михан, Алан Геллер,
Сиддхартха Сингх, Сэм Ли, Сасан Даштинежад, Алекс Мартин, Стив Каи, Томас
Фручтерман, Кори Хикс, Дэвид Смаллберг, Гунавардан Какулапати, Дэнни Раббани, Джейк Кохен, Хендрик Шубер, Пако Вициана, Гленн Кеннеди, Джефри
Д. Олдхам, Николас Страуструп, Мэтью Вильсон, Андрей Александреску, Тим
Джонсон, Леон Мэтьюс, Питер Дулимов и Кевлин Хенни. Черновики некоторых отдельных параграфов, кроме того, просматривали Херб Саттер и Аттила Ф. Фехер.

Благодарности
Благодарности
Благодарности
Благодарности
Благодарности

14
14
14
14
Благодарности
Благодарности
Благодарности
Благодарности
Благодарности

Просмотр сырой (и, возможно, неполной) рукописи – это трудная работа,
а наличие жестких сроков только делает ее еще труднее. Я благодарен всем, кто
выразил желание помочь мне в этом.
Просмотр рукописи тем более труден, если вы не имеете представления о материале, но не должны пропустить ни одной неточности, которая могла бы вкрасться в текст. Поразительно, что находятся люди, согласные редактировать тексты.
Криста Медоубрук была редактором этой книги и сумела выявить немало ошибок, которые пропустили все остальные.
Леор Золман в ходе рецензирования рукописи проверил все примеры кода на
различных компиляторах, а затем сделал это еще раз, после того как я внес изменения. Если какието ошибки остались, за них несу ответственность я, а не Леор.
Карл Вигерс и особенно Тим Джонсон написали краткий, но полезный текст
для обложки.
Джон Вэйт, редактор первых двух изданий этой книги, неосмотрительно согласился снова поработать в этом качестве. Его помощница, Дениз Микельсен,
неизменно отвечала приятной улыбкой на мои частые и докучливые замечания
(по крайней мере, мне так кажется, хотя лично я никогда с ней не встречался). Джулия Нахил «вытащила короткую соломинку», ей пришлось отвечать за производство
этой книги. В течение шести недель она сидела ночами, чтобы выдержать график,
не теряя при этом хладнокровия. Джон Фуллер (ее начальник) и Марти Рабинович
(его начальница) также принимали непосредственное участие в процессе подготовки издания. Официальные обязанности Ванессы Мур заключались в макетировании
книги в программе FrameMaker и создании текста в формате PDF, но она по своей
инициативе внесла добавления в Приложение B и отформатировала его для печати
на внутренней стороне обложки. Сольвейг Хьюгланд помогла с составлением указателя. Сандра Шройедер и Чути Прасерцит отвечали за дизайн обложки. Именно
Чути приходилось переделывать обложку всякий раз, как я говорил «Как насчет
того, чтобы поместить эту фотографию, но с полоской другого цвета?». Чанда ЛериКоути совершенно вымоталась, занимаясь маркетингом книги.
В течение нескольких месяцев, пока я работал над рукописью, телевизионный
сериал «Баффи – убийца вампиров» помогал мне снять стресс в конце дня. Потребовалось немало усилий, чтобы изгнать говорок Баффи со страниц этой книги.
Кэти Рид учила меня программированию в 1971 году, и я рад, что мы остаемся друзьями по сей день. Дональд Френч нанял меня и Моисея Лежтера для разработки учебных материалов по C++ в 1989 году (что заставило меня действительно
изучить C++), а в 1991 году он привлек меня к презентации их на компьютере
Stratus. Тогда студенты подвигли меня написать то, что впоследствии стало первой редакцией этой книги. Дон также познакомил меня с Джоном Вайтом, который согласился опубликовать ее.
Моя жена, Нэнси Л. Урбано, продолжает поощрять мое писательство, даже
после семи изданных книг, адаптации их для CD и диссертации. Она обладает
невероятным терпением. Без нее я бы никогда не смог сделать то, что сделал.
От начала до конца наша собака Персефона была моим бескорыстным компаньоном. К сожалению, в большей части проекта она участвовала, уже находясь в погребальной урне. Нам ее очень не хватает.

К покупке доступен более свежий выпуск Перейти