По мере развития вычислительной техники научные и инженерные проекты становятся все более крупными и сложными, и все более вероятно, что все новые проекты будут разрабатываться на C++. По мере того, как встраиваемое аппаратное обеспечение становится все более мощным, его программное обеспечение также все чаще разрабатывается на C++.
Овладение языком программирования C++ дает вам навыки программирования почти на каждом уровне - от близкого к аппаратному обеспечению до абстракций высшего уровня. Короче говоря, C++ - это тот язык, который научные и технические специалисты должны знать в обязательном порядке.
Книга "C++ для инженерных и научных расчетов" Питера Готтшлинга представляет собой интенсивное введение в язык программирования C++, облегчающее переход к действительно сложным темам, основанным на передовых методах программирования. Автор вводит ключевые понятия с использованием примеров из многих предметных областей, опираясь на свой обширный опыт обучения языку C++ студентов, обучающихся физическим, математическим и инженерным специальностям.
Эта книга призвана помочь вам быстро приступить к реальной работе, а затем совершенствовать свои знания и умения, осваивая все более сложные возможности языка - от лямбда-функций до шаблонов выражений. Вы также узнаете, как использовать преимущества мощных библиотек, доступных программистам на C++: стандартной библиотеки шаблонов (STL) и научных библиотек для арифметических вычислений, решения задач линейной алгебры, дифференциальных уравнений или построения графиков.
На протяжении всей книги автор показывает, как писать программное обеспечение четко и выразительно, используя парадигмы объектно-ориентированного программирования, обобщенного и метапрограммирования и процедурные методы.
К тому времени, когда вы закончите чтение книги, вы освоите все абстракции, необходимые для написания программ на C++, обладающих исключительным качеством и производительностью.
Author(s): Готтшлинг Питер
Publisher: Диалектика
Year: 2020
Language: Russian
Pages: 512
City: СПб
Содержание
Предисловие
Причины для изучения C++
Причины для чтения данной книги
Красавица и чудовище
Языки в науке и технике
Соглашения об оформлении
Благодарности
Об авторе
Ждем ваших отзывов!
Глава 1. Основы C++
1.1. Наша первая программа
1.2. Переменные
1.2.1. Константы
1.2.2. Литералы
1.2.3. Не сужающая инициализация в C++11
1.2.4. Области видимости
1.3. Операторы
1.3.1. Арифметические операторы
1.3.2. Булевы операторы
1.3.3. Побитовые операторы
1.3.4. Присваивание
1.3.5. Поток выполнения
1.3.6. Работа с памятью
1.3.7. Операторы доступа
1.3.8. Работа с типами
1.3.9. Обработка ошибок
1.3.10. Перегрузка
1.3.11. Приоритеты операторов
1.3.12. Избегайте побочных эффектов!
1.4. Выражения и инструкции
1.4.1. Выражения
1.4.2. Инструкции
1.4.3. Ветвление
1.4.4. Циклы
1.4.5. goto
1.5. Функции
1.5.1. Аргументы
1.5.2. Возврат результатов
1.5.3. Встраивание
1.5.4. Перегрузка
1.5.5. Функция main
1.6. Обработка ошибок
1.6.1. Утверждения
1.6.2. Исключения
1.6.3. Статические утверждения
1.7. Ввод-вывод
1.7.1. Стандартный вывод
1.7.2. Стандартный ввод
1.7.3. Ввод-вывод в файлы
1.7.4. Обобщенная концепция потоков
1.7.5. Форматирование
1.7.6. Обработка ошибок ввода-вывода
1.8. Массивы, указатели и ссылки
1.8.1. Массивы
1.8.2. Указатели
1.8.3. Интеллектуальные указатели
1.8.3.1. unique_ptr
1.8.4. Ссылки
1.8.5. Сравнение указателей и ссылок
1.8.6. Не ссылайтесь на устаревшие данные!
1.8.7. Контейнеры в качестве массивов
1.9. Структурирование программных проектов
1.9.1. Комментарии
1.9.2. Директивы препроцессора
1.10. Упражнения
1.10.1. Возраст
1.10.2. Массивы и указатели
1.10.3. Чтение заголовка файла Matrix Market
Глава 2. Классы
2.1. Программируйте универсальный смысл, а не технические детали
2.2. Члены
2.2.1. Переменные-члены
2.2.2. Доступность
2.2.3. Операторы доступа
2.2.4. Декларатор static в классах
2.2.5. Функции-члены
2.3. Установка значений. Конструкторы и присваивания
2.3.1. Конструкторы
2.3.2. Присваивание
2.3.3. Список инициализаторов
2.3.5. Семантика перемещения
2.4. Деструкторы
2.4.1. Правила реализации
2.4.2. Корректная работа с ресурсами
2.5. Резюме генерации методов
2.6. Доступ к переменным-членам
2.6.1. Функции доступа
2.6.2. Оператор индекса
2.6.3. Константные функции-члены
2.6.4. Ссылочная квалификация членов
2.7. Проектирование перегрузки операторов
2.7.1. Будьте последовательны
2.7.2. Вопросы приоритетов
2.7.3. Члены или свободные функции
2.8. Упражнения
2.8.1. Полиномы
2.8.2. Перемещающее присваивание
2.8.3. Список инициализаторов
2.8.4. Спасение ресурса
Глава 3. Обобщенное программирование
3.1. Шаблоны функций
3.1.1. Инстанцирование
3.1.2. Вывод типа параметров
3.1.3. Работа с ошибками в шаблонах
3.1.4. Смешение типов
3.1.5. Унифицированная инициализация
3.1.6. Автоматический возвращаемый тип
3.2. Пространства имен и поиск функций
3.2.1. Пространства имен
3.2.2. Поиск, зависящий от аргумента
3.2.3. Квалификация пространств имен или ADL
3.3. Шаблоны классов
3.3.1. Пример контейнера
3.3.2. Проектирование унифицированных интерфейсов классов и функций
3.4. Вывод и определение типа
3.4.1. Автоматический тип переменных
3.4.2. Тип выражения
3.4.3. decltype(auto)
3.4.4. Определение типов
3.5. Немного теории шаблонов: концепции
3.6. Специализация шаблонов
3.6.1. Специализация класса для одного типа
3.6.2. Специализация и перегрузка функций
3.6.3. Частичная специализация
3.6.4. Частично специализированные функции
3.7. Параметры шаблонов, не являющиеся типами
3.8. Функторы
3.8.1. Функциональные параметры
3.8.2. Составные функторы
3.8.3. Рекурсия
3.8.4. Обобщенное суммирование
3.9. Лямбда-выражения
3.9.1. Захват
3.9.2. Захват по значению
3.9.3. Захват по ссылке
3.9.4. Обобщенный захват
3.9.5. Обобщенные лямбда-выражения
3.10. Вариативные шаблоны
3.11. Упражнения
3.11.1. Строковое представление
3.11.2. Строковое представление кортежей
3.11.3. Обобщенный стек
3.11.4. Итератор вектора
3.11.5. Нечетный итератор
3.11.6. Нечетный диапазон
3.11.7. Стек bool
3.11.8. Стек с пользовательским размером
3.11.9. Вывод аргументов шаблона, не являющихся типами
3.11.10. Метод трапеций
3.11.11. Функтор
3.11.12. Лямбда-выражения
3.11.13. Реализация make_unique
Глава 4. Библиотеки
4.1. Стандартная библиотека шаблонов
4.1.1. Вводный пример
4.1.2. Итераторы
4.1.3. Контейнеры
4.1.4. Алгоритмы
4.1.5. За итераторами
4.2. Числовые алгоритмы
4.2.1. Комплексные числа
4.2.2. Генераторы случайных чисел
4.3. Метапрограммирование
4.3.1. Пределы
4.3.2. Свойства типов
4.4. Утилиты
4.4.1. tuple
4.4.2. function
4.4.3. Оболочка для ссылок
4.5. Время — сейчас!
4.6. Параллельность
4.7. Научные библиотеки за пределами стандарта
4.7.1. Иная арифметика
4.7.2. Арифметика интервалов
4.7.3. Линейная алгебра
4.7.4. Обычные дифференциальные уравнения
4.7.5. Дифференциальные уравнения в частных производных
4.7.6. Алгоритмы на графах
4.8. Упражнения
4.8.1. Сортировка по абсолютной величине
4.8.2. Контейнер STL
4.8.3. Комплексные числа
Глава 5. Метапрограммирование
5.1. Пусть считает компилятор
5.1.1. Функции времени компиляции
5.1.2. Расширенные функции времени компиляции
5.1.3. Простота
5.1.4. Насколько константны наши константы
5.2. Предоставление и использование информации о типах
5.2.1. Свойства типов
5.2.2. Условная обработка исключений
5.2.3. Пример применения константности
5.2.4. Стандартные свойства типов
5.2.5. Свойства типов, специфичные для предметной области
5.2.6. enable_if
5.2.7. Еще о вариативных шаблонах
5.2.7.1. Вариативный шаблон класса
5.3. Шаблоны выражений
5.3.1. Реализация простого оператора
5.3.2. Класс шаблона выражения
5.3.3. Обобщенные шаблоны выражений
5.4. Метанастройка: написание собственной оптимизации
5.4.1. Классическое развертывание фиксированного размера
5.4.2. Вложенное развертывание
5.4.3. Динамическое развертывание: разминка
5.4.4. Развертывание векторных выражений
5.4.5. Настройка шаблона выражения
5.4.6. Настройки операций сверток
5.4.7. Настройка вложенных циклов
5.4.8. Резюме
5.5. Упражнения
5.5.1. Свойства типов
5.5.2. Последовательность Фибоначчи
5.5.3. Метапрограммирование НОД
5.5.4. Шаблон векторного выражения
5.5.5. Метасписок
Глава 6. Объектно-ориентированное программирование
6.1. Фундаментальные принципы
6.1.1. Базовые и производные классы
6.1.2. Наследование конструкторов
6.1.3. Виртуальные функции и полиморфные классы
6.1.4. Функторы и наследование
6.2. Устранение избыточности
6.3. Множественное наследование
6.3.1. Множественные родители
6.3.2. Общие прародители
6.4. Динамический выбор с использованием подтипов
6.5. Преобразования
6.5.1. Преобразование между базовыми и производными классами
6.5.2. const__cast
6.5.3. reinterpret_cast
6.5.4. Преобразования в стиле функций
6.5.5. Неявные преобразования
6.6. CRTP
6.6.1. Простой пример
6.6.2. Повторно используемый оператор доступа
6.7. Упражнения
6.7.1. Ромбовидное наследование без избыточности
6.7.2. Наследование класса вектора
6.7.3. Функция клонирования
Глава 7. Научные проекты
7.1. Реализация решателей ОДУ
7.1.1. Обыкновенные дифференциальные уравнения
7.1.2. Алгоритмы Рунге-Кутты
7.1.3. Обобщенная реализация
7.1.4. Дальнейшее развитие
7.2. Создание проектов
7.2.1. Процесс построения
7.2.2. Инструменты для построения приложений
7.2.3. Раздельная компиляция
7.3. Несколько заключительных слов
Приложение А. Скучные детали
А.1. О хорошем и плохом научном программном обеспечении
А.2. Детали основ
А.2.1. О квалифицирующих литералах
А.2.2. Статические переменные
А.2.3. Еще немного об if
А.2.4. Метод Даффа
А.2.5. Еще немного о функции main
А.2.6. Утверждения или исключения?
А.2.7. Бинарный ввод-вывод
А.2.8. Ввод-вывод в стиле С
А.2.9. Сборка мусора
А.2.10. Проблемы с макросами
А.3. Реальный пример: обращение матриц
А.4. Больше о классах
А.4.1. Указатель на член
А.4.2. Примеры инициализации
А.4.3. Обращение к многомерным массивам
А.5. Генерация методов
А.5.1. Управление генерацией
А.5.2. Правила генерации
А.5.3. Ловушки и советы по проектированию
А.6. Подробнее о шаблонах
А.6.1. Унифицированная инициализация
А.6.2. Какая функция вызвана?
А.6.3. Специализация для определенного аппаратного обеспечения
А.6.4. Бинарный ввод-вывод с переменным числом аргументов
А.7. Использование std: : vector в С++03
А.8. Динамический выбор в старом стиле
A.9. Подробности метапрограммирования
А.9.1. Первая метапрограмма в истории
А.9.2. Метафункции
А.9.3. Обратно совместимые статические утверждения
А.9.4. Анонимные параметры типа
А.9.5. Проверка производительности динамического развертывания
A.9.6. Производительность умножения матриц
Приложение Б. Инструментарий для программирования
Б.1. gcc
Б.2. Отладка
Б.2.1. Текстовая отладка
Б.2.2. Отладка с графическим интерфейсом: DDD
Б.3. Анализ памяти
Б.4. gnuplot
Б.5. Unix, Linux и Mac OS
Приложение В. Определения языка
B.1. Категории значений
В.2. Обзор операторов
В.3. Правила преобразования
B.3.1. Повышение
В.3.2. Другие преобразования
В.3.3. Обычные арифметические преобразования
В.3.4. Сужение
Библиография
Предметный указатель