Опытные программисты на C++ Гай Дэвидсон и Кейт Грегори определяют 30 основных рекомендаций, которые вы найдете особенно ценными, и предлагают подробные практические знания для улучшения вашего стиля C++. Для удобства эта книга структурирована так, чтобы точно соответствовать официальному веб-сайту C++ Core Guidelines.
На протяжении всей книги Дэвидсон и Грегори предлагают полезную концептуальную информацию и опытный образец кода, освещают проверенные способы более успешного использования как новых, так и старых функций языка и показывают, как писать программы, которые по умолчанию являются более надежными и производительными.
Избегайте «сброса велосипедов»: перестаньте тратить драгоценное время на пустяки.
Не навредите себе, написав код, который позже вызовет проблемы
Знайте, каких устаревших функций следует избегать, а какие современные использовать вместо них.
Правильно используйте новые функции, чтобы получить их преимущества, не создавая новых проблем.
По умолчанию используйте код более высокого качества, который является статически типобезопасным, устойчивым к утечкам и более простым в развитии.
Используйте Основные рекомендации с любой современной версией C++: C++20, C++17, C++14 или C++11.
Здесь есть что улучшить практически в каждой программе, которую вы пишете, проектируете или поддерживаете.
Author(s): Дэвидсон Дж.Г., Грегори К.
Edition: 1
Publisher: Питер
Year: 2023
Language: Russian
City: Санкт-Петербург
Tags: C++ Programming Language; C++20; C++17; C++14; C++11; System Programming; Programming Guidelines; Programming Best Practicies
Избранные рекомендации по C++
Предисловие
Вступление
О книге
Доступность кода примеров
Благодарности
Об авторах
От издательства
Часть I. Bikeshedding — это плохо
Глава 1.1. P.2. Придерживайтесь стандарта ISO C++
Что такое стандарт ISO C++
История С++
Инкапсуляция вариаций
Вариации в окружении времени выполнения
Вариации на уровне языка C++ и компилятора
Расширения для С++
Защита заголовочных файлов
Вариации в основных типах
Нормативные ограничения
Изучение старых способов
Обратная совместимость в C++
Прямая совместимость и Y2K
Следите за последними изменениями в стандарте
IsoCpp
Конференции
Другие источники
Глава 1.2. F.51. Если есть выбор, используйте аргументы по умолчанию вместо перегрузки
Введение
Доработка ваших абстракций: дополнительные аргументы или перегрузка?
Тонкости разрешения перегрузки
Вернемся к примеру
Однозначная природа аргументов по умолчанию
Альтернативы перегрузке
Иногда без перегрузки не обойтись
Подведем итог
Глава 1.3. C.45. Не определяйте конструктор по умолчанию, который просто инициализирует переменные-члены; для этой цели лучше использовать внутриклассовые инициализаторы членов
Зачем нужны конструкторы по умолчанию
Как инициализируются переменные-члены
Что может случиться, если поддерживать класс будут два человека?
Сборная солянка из конструкторов
Аргументы по умолчанию могут запутать ситуацию в перегруженных функциях.
Подведем итог
Глава 1.4. C.131. Избегайте тривиальных геттеров и сеттеров
Архаичная идиома
Абстракции
Простая инкапсуляция
Инварианты класса
Существительные и глаголы
Подведем итог
Глава 1.5. ES.10. Объявляйте имена по одному в каждом объявлении
Позвольте представить
Обратная совместимость
Пишите более ясные объявления
Структурное связывание
Подведем итог
Глава 1.6. NR.2. Функции необязательно должны иметь только один оператор возврата
Правила меняются
Гарантия очистки
Идиома RAII
Пишите хорошие функции
Подведем итог
Часть II. Не навредите себе
Глава 2.1. P.11. Инкапсулируйте беспорядочные конструкции, а не разбрасывайте их по всему коду
Все одним глотком
Что означает инкапсулировать запутанную конструкцию
Назначение языка и природа абстракции
Уровни абстракции
Абстракция путем рефакторинга и проведения линии
Подведем итог
Глава 2.2. I.23. Минимизируйте число параметров в функциях
Сколько они должны получать?
Упрощение через абстрагирование
Делайте так мало, как возможно, но не меньше
Примеры из реальной жизни
Подведем итог
Глава 2.3. I.26. Если нужен кросс-компилируемый ABI, используйте подмножество в стиле C
Создавайте библиотеки
Что такое ABI
Сокращайте до абсолютного минимума
Распространение исключений
Подведем итог
Глава 2.4. C.47. Определяйте и инициализируйте переменные-члены в порядке их объявления
Подведем итог
Глава 2.5. CP.3. Сведите к минимуму явное совместное использование записываемых данных
Традиционная модель выполнения
Подождите, это еще не все
Предотвращение взаимоблокировок и гонок за данными
Отказ от блокировок и мьютексов
Подведем итог
Глава 2.6. Т.120. Используйте метапрограммирование шаблонов, только когда это действительно необходимо
std::enable_if => requires
Подведем итог
Часть III. Прекратите использовать это
Глава 3.1. I.11. Никогда не передавайте владение через необработанный (простой) указатель (T*) или ссылку (T&)
Использование области свободной памяти
Производительность интеллектуальных указателей
Использование простой семантики ссылок
gsl::owner
Подведем итог
Глава 3.2. I.3. Избегайте синглтонов
Глобальные объекты — это плохо
Шаблон проектирования «Синглтон»
Фиаско порядка статической инициализации
Как скрыть синглтон
Только один из них должен существовать в каждый момент работы кода
Подождите минутку...
Подведем итог
Глава 3.3. C.90. Полагайтесь на конструкторы и операторы присваивания вместо memset и memcpy
В погоне за максимальной производительностью
Ужасные накладные расходы конструкторов
Самый простой класс
О чем говорит стандарт?
А как же memcpy?
Никогда не позволяйте себе недооценивать компилятор
Подведем итог
Глава 3.4. ES.50. Не приводите переменные с квалификатором const к неконстантному типу
Работа с большим количеством данных
Брандмауэр const
Реализация двойного интерфейса
Кэширование и отложенные вычисления
Два вида const
Сюрпризы const
Подведем итог
Глава 3.5. E.28. При обработке ошибок избегайте глобальных состояний (например, errno)
Обрабатывать ошибки сложно
Язык C и errno
Коды возврата
Исключения
Boost.Outcome
Почему обрабатывать ошибки так сложно?
Свет в конце туннеля
Подведем итог
Глава 3.6. SF.7. Не используйте using namespace в глобальной области видимости в заголовочном файле
Не делайте этого
Неоднозначность
Использование using
Куда попадают символы?
Еще более коварная проблема
Решение проблемы операторов разрешения области видимости
Искушение и расплата
Подведем итог
Часть IV. Используйте эту новую особенность правильно
Глава 4.1. F.21. Для возврата нескольких «выходных» значений используйте структуры или кортежи
Форма сигнатуры функции
Документирование и аннотирование
Теперь можно вернуть объект
Также можно вернуть кортеж
Передача и возврат по неконстантной ссылке
Подведем итог
Глава 4.2. Enum.3. Старайтесь использовать классы-перечисления вместо «простых» перечислений
Константы
Перечисления с заданной областью видимости
Базовый тип
Неявное преобразование
Подведем итог
Глава 4.3. ES.5. Минимизируйте области видимости
Природа области видимости
Область видимости блока
Область видимости пространства имен
Область видимости класса
Область видимости параметров функции
Область видимости перечисления
Область действия параметра шаблона
Область видимости как контекст
Подведем итог
Глава 4.4. Con.5. Используйте constexpr для определения значений, которые можно вычислить на этапе компиляции
От const к constexpr
С++ по умолчанию
Использование constexpr
inline
consteval
constinit
Подведем итог
Глава 4.5. T.1. Используйте шаблоны для повышения уровня абстрактности кода
Повышение уровня абстракции
Шаблоны функций и абстракция
Шаблоны классов и абстракция
Выбор имени — сложная задача
Подведем итог
Глава 4.6. T.10. Задавайте концепции для всех аргументов шаблона
Как мы здесь оказались?
Ограничение параметров
Как абстрагировать свои концепции
Разложение на составляющие через концепции
Подведем итог
Часть V. Пишите хороший код по умолчанию
Глава 5.1. P.4. В идеале программа должна быть статически типобезопасной
Безопасность типов — это средство защиты в C++
Объединения
Приведение
Целые без знака
Буферы и размеры
Подведем итог
Глава 5.2. P.10. Неизменяемые данные предпочтительнее изменяемых
Неправильные значения по умолчанию
const в объявлениях функций
Подведем итог
Глава 5.3. I.30. Инкапсулируйте нарушения правил
Сокрытие неприглядных вещей
Поддержание видимости, что все в порядке
Подведем итог
Глава 5.4. ES.22. Не объявляйте переменные, пока не получите значения для их инициализации
Важность выражений и операторов
Объявление в стиле C
Объявление с последующей инициализацией
Максимальное откладывание объявления
Локализация контекстно-зависимой функциональности
Устранение состояния
Подведем итог
Глава 5.5. Per.7. При проектировании учитывайте возможность последующей оптимизации
Максимальная частота кадров
Работа вдалеке от железа
Оптимизация через абстракцию
Подведем итог
Глава 5.6. E.6. Используйте
идиому RAII для предотвращения утечек памяти
Детерминированное уничтожение
Утечка файлов
Почему это так важно?
Все это выглядит чересчур сложным: будущие возможности
Где все это получить?
Заключение
Послесловие