Язык программирования C++.
- Введение. ⇢
- Для кого написана эта книга.
- Изменения в пятом издании.
- Структура книги.
- Соглашения, принятые в книге.
- Примечание о компиляторах.
- Благодарности.
- От издательства.
- Глава 1. Первые шаги. ⇢
- 1.1. Создание простой программы на языке С++ ⇢
- Ключевая концепция. Типы.
- 1.1.1. Компиляция и запуск программы. ⇢
- Соглашение об именовании файлов исходного кода.
- Запуск компилятора из командной строки.
- Вызов компилятора GNU или Microsoft.
- Упражнения раздела 1.1.1.
- 1.2. Первый взгляд на ввод-вывод. ⇢
- Стандартные объекты ввода и вывода.
- Программа, использующая библиотеку ввода-вывода.
- Запись в поток.
- Использование имен из стандартной библиотеки.
- Чтение из потока.
- Завершение программы.
- Упражнения раздела 1.2.
- 1.3. Несколько слов о комментариях. ⇢
- Виды комментариев в С++
- Парный комментарий не допускает вложения.
- Упражнения раздела 1.3.
- 1.4. Средства управления. ⇢
- 1.4.1. Оператор while. ⇢
- Упражнения раздела 1.4.1.
- 1.4.2. Оператор for. ⇢
- Упражнения раздела 1.4.2.
- 1.4.3. Ввод неизвестного количества данных. ⇢
- Ввод конца файла с клавиатуры.
- Возвращаясь к компиляции.
- Упражнения раздела 1.4.3.
- 1.4.4. Оператор if. ⇢
- Упражнения раздела 1.4.4.
- Ключевая концепция. Выравнивание и форматирование кода программ C++
- 1.5. Введение в классы. ⇢
- 1.5.1. Класс Sales_item. ⇢
- Ключевая концепция. Определение поведения класса.
- Чтение и запись объектов класса Sales_item.
- Суммирование объектов класса Sales_item.
- Использование перенаправления файлов.
- Упражнения раздела 1.5.1.
- 1.5.2. Первый взгляд на функции-члены. ⇢
- Что такое функция-член?
- Упражнения раздела 1.5.2.
- 1.6. Программа для книжного магазина. ⇢
- Упражнения раздела 1.6.
- Резюме. ⇢
- Термины. ⇢
- Часть I. Основы. ⇢
- Глава 2. Переменные и базовые типы. ⇢
- 2.1. Простые встроенные типы. ⇢
- 2.1.1. Арифметические типы. ⇢
- Машинный уровень представления встроенных типов.
- Знаковые и беззнаковые типы.
- Совет. Какой тип использовать.
- Упражнения раздела 2.1.1.
- 2.1.2. Преобразование типов. ⇢
- Совет. Избегайте неопределенного и машинно-зависимого поведения.
- Выражения, задействующие беззнаковые типы.
- Внимание! Не смешивайте знаковые и беззнаковые типы.
- Упражнения раздела 2.1.2.
- 2.1.3. Литералы. ⇢
- Целочисленные литералы и литералы с плавающей запятой.
- Символьные и строковые литералы.
- Управляющие последовательности.
- Определение типа литерала.
- Логические литералы и литеральные указатели.
- Упражнения раздела 2.1.3.
- 2.2. Переменные. ⇢
- 2.2.1. Определения переменных. ⇢
- Терминология. Что такое объект?
- Инициализаторы.
- Списочная инициализация.
- Инициализация по умолчанию.
- Упражнения раздела 2.2.1.
- 2.2.2. Объявления и определения переменных. ⇢
- Внимание! Неинициализированные переменные — причина проблем во время выполнения.
- Упражнения раздела 2.2.2.
- Ключевая концепция. Статическая типизация.
- 2.2.3. Идентификаторы. ⇢
- Соглашения об именах переменных.
- Упражнения раздела 2.2.3.
- 2.2.4. Область видимости имен. ⇢
- Совет. Определяйте переменные при первом использовании.
- Вложенные области видимости.
- Упражнения раздела 2.2.4.
- 2.3. Составные типы. ⇢
- 2.3.1. Ссылки. ⇢
- Ссылка — это псевдоним.
- Определение ссылок.
- Упражнения раздела 2.3.1.
- 2.3.2. Указатели. ⇢
- Получение адреса объекта.
- Значение указателя.
- Использование указателя для доступа к объекту.
- Ключевая концепция. У некоторых символов есть несколько значений.
- Нулевые указатели.
- Совет. Инициализируйте все указатели.
- Присвоение и указатели.
- Другие операции с указателями.
- Упражнения раздела 2.3.2.
- 2.3.3. Понятие описаний составных типов. ⇢
- Определение нескольких переменных.
- Указатели на указатели.
- Ссылки на указатели.
- Упражнения раздела 2.3.3.
- 2.4. Спецификатор const. ⇢
- Инициализация и константы.
- По умолчанию константные объекты локальны для файла.
- Упражнения раздела 2.4.
- 2.4.1. Ссылка на константу. ⇢
- Терминология. Константная ссылка — это ссылка на константу.
- Инициализация и ссылки на константу.
- Ссылка на константу может ссылаться на неконстантный объект.
- 2.4.2. Указатели и спецификатор const. ⇢
- Константные указатели.
- Упражнения раздела 2.4.2.
- 2.4.3. Спецификатор const верхнего уровня. ⇢
- Упражнения раздела 2.4.3.
- 2.4.4. Переменные constexpr и константные выражения. ⇢
- Переменные constexpr.
- Литеральные типы.
- Указатели и спецификатор constexpr.
- Упражнения раздела 2.4.4.
- 2.5. Работа с типами. ⇢
- 2.5.1. Псевдонимы типов. ⇢
- Указатели, константы и псевдонимы типа.
- 2.5.2. Спецификатор типа auto. ⇢
- Составные типы, const и auto.
- Упражнения раздела 2.5.2.
- 2.5.3. Спецификатор типа decltype. ⇢
- Спецификатор decltype и ссылки.
- Упражнения раздела 2.5.3.
- 2.6. Определение собственных структур данных. ⇢
- 2.6.1 Определение типа Sales_data. ⇢
- Переменные-члены класса.
- Упражнения раздела 2.6.1.
- 2.6.2. Использование класса Sales_data. ⇢
- Суммирование двух объектов класса Sales_data.
- Чтение данных в объект класса Sales_data.
- Вывод суммы двух объектов класса Sales_data.
- Упражнения раздела 2.6.2.
- 2.6.3. Создание собственных файлов заголовка. ⇢
- Краткое введение в препроцессор.
- Упражнения раздела 2.6.3.
- Резюме. ⇢
- Термины. ⇢
- Глава 3. Типы string, vector и массивы. ⇢
- 3.1. Пространства имен и объявления using. ⇢
- Для каждого имени необходимо индивидуальное объявление using.
- Заголовки не должны содержать объявлений using.
- Примечание для читателя.
- Упражнения раздела 3.1.
- 3.2. Библиотечный тип string. ⇢
- 3.2.1. Определение и инициализация строк. ⇢
- Прямая инициализация и инициализация копией.
- 3.2.2. Операции со строками. ⇢
- Чтение и запись строк.
- Чтение неопределенного количества строк.
- Применение функции getline() для чтения целой строки.
- Строковые операции size() и empty().
- Тип string::size_type.
- Сравнение строк.
- Присвоение строк.
- Сложение двух строк.
- Сложение строк и символьных строковых литералов.
- Упражнения раздела 3.2.2.
- 3.2.3. Работа с символами строки. ⇢
- Совет. Используйте версии С++ библиотечных заголовков языка С.
- Обработка каждого символа, использование серийного оператора for.
- Использование серийного оператора for для изменения символов в строке.
- Обработка лишь некоторых символов.
- Использование индексирования для перебора.
- Внимание! Индексирование не контролируется.
- Использование индексирования для произвольного доступа.
- Упражнения раздела 3.2.3.
- 3.3. Библиотечный тип vector. ⇢
- 3.3.1. Определение и инициализация векторов. ⇢
- Списочная инициализация вектора.
- Создание определенного количества элементов.
- Инициализация значения.
- Списочный инициализатор или количество элементов.
- Упражнения раздела 3.3.1.
- 3.3.2. Добавление элементов в вектор. ⇢
- Ключевая концепция. Рост вектора эффективен.
- Последствия возможности добавления элементов в вектор.
- Упражнения раздела 3.3.2.
- 3.3.3. Другие операции с векторами. ⇢
- Вычисление индекса вектора.
- Индексация не добавляет элементов.
- Внимание! Индексировать можно лишь существующие элементы!
- Упражнения раздела 3.3.3.
- 3.4. Знакомство с итераторами. ⇢
- 3.4.1. Использование итераторов. ⇢
- Операции с итераторами.
- Перемещение итератора с одного элемента на другой.
- Ключевая концепция. Обобщенное программирование.
- Типы итераторов.
- Терминология. Итераторы и типы итераторов.
- Функции begin() и end().
- Объединение обращения к значению и доступа к члену.
- Некоторые операции с векторами делают итераторы недопустимыми.
- 3.4.2. Арифметические действия с итераторами. ⇢
- Арифметические операции с итераторами.
- Использование арифметических действий с итераторами.
- Упражнения раздела 3.4.2.
- 3.5. Массивы. ⇢
- 3.5.1. Определение и инициализация встроенных массивов. ⇢
- Явная инициализация элементов массива.
- Особенности символьных массивов.
- Не допускается ни копирование, ни присвоение.
- Понятие сложных объявлений массива.
- Упражнения раздела 3.5.1.
- 3.5.2. Доступ к элементам массива. ⇢
- Проверка значений индекса.
- Упражнения раздела 3.5.2.
- 3.5.3. Указатели и массивы. ⇢
- Указатели — это итераторы.
- Библиотечные функции begin() и end().
- Арифметические действия с указателями.
- Взаимодействие обращения к значению с арифметическими действиями с указателями.
- Индексирование и указатели.
- Упражнения раздела 3.5.3.
- 3.5.4. Символьные строки в стиле С. ⇢
- Строковые функции библиотеки С.
- Сравнение строк.
- За размер строки отвечает вызывающая сторона.
- Упражнения раздела 3.5.4.
- 3.5.5. Взаимодействие с устаревшим кодом. ⇢
- Совместное использование библиотечных строки строк в стиле С.
- Использование массива для инициализации вектора.
- Совет. Используйте вместо массивов библиотечные типы.
- Упражнения раздела 3.5.5.
- 3.6. Многомерные массивы. ⇢
- Инициализация элементов многомерного массива.
- Индексация многомерных массивов.
- Использование серийного оператора for с многомерными массивами.
- Указатели и многомерные массивы.
- Псевдонимы типов упрощают указатели на многомерные массивы.
- Упражнения раздела 3.6.
- Резюме. ⇢
- Термины. ⇢
- Глава 4. Выражения. ⇢
- 4.1. Основы. ⇢
- 4.1.1. Фундаментальные концепции. ⇢
- Группировка операторов и операндов.
- Преобразование операндов.
- Перегруженные операторы.
- L- и r-значения.
- 4.1.2. Приоритет и порядок. ⇢
- Круглые скобки переопределяют приоритет и порядок.
- Когда важны приоритет и порядок.
- Упражнения раздела 4.1.2.
- 4.1.3. Порядок вычисления. ⇢
- Порядок вычисления, приоритет и порядок операторов.
- Упражнения раздела 4.1.3.
- Совет. Манипулирование составными выражениями.
- 4.2. Арифметические операторы. ⇢
- Внимание! Переполнение переменной и другие арифметические особенности.
- Упражнения раздела 4.2.
- 4.3. Логические операторы и операторы отношения. ⇢
- Операторы логического AND и OR.
- Оператор логического NOT.
- Операторы отношения.
- Проверка равенства и логические литералы.
- Упражнения раздела 4.3.
- 4.4. Операторы присвоения. ⇢
- Оператор присвоения имеет правосторонний порядок.
- Оператор присвоения имеет низкий приоритет.
- Не перепутайте операторы равенства и присвоения.
- Составные операторы присвоения.
- Упражнения раздела 4.4.
- 4.5. Операторы инкремента и декремента. ⇢
- Совет. Используйте постфиксные операторы только по мере необходимости.
- Объединение операторов обращения к значению и инкремента в одном выражении.
- Совет. Краткость может быть достоинством.
- Помните, что операнды могут быть обработаны в любом порядке.
- Упражнения раздела 4.5.
- 4.6. Операторы доступа к членам. ⇢
- Упражнения раздела 4.6.
- 4.7. Условный оператор. ⇢
- Вложенные условные операторы.
- Применение условного оператора в выражении вывода.
- Упражнения раздела 4.7.
- 4.8. Побитовые операторы. ⇢
- Побитовые операторы сдвига.
- Побитовый оператор NOT.
- Побитовые операторы AND, OR и XOR.
- Использование побитовых операторов.
- Операторы сдвига (они же ввода и вывода) имеют левосторонний порядок.
- Упражнения раздела 4.8.
- 4.9. Оператор sizeof. ⇢
- Упражнения раздела 4.9.
- 4.10. Оператор запятая. ⇢
- Упражнения раздела 4.10.
- 4.11. Преобразование типов. ⇢
- Когда происходят неявные преобразования.
- 4.11.1. Арифметические преобразования. ⇢
- Целочисленные преобразования.
- Операнды беззнакового типа.
- Концепция арифметических преобразований.
- Упражнения раздела 4.11.1.
- 4.11.2. Другие неявные преобразования. ⇢
- 4.11.3. Явные преобразования. ⇢
- Именованные операторы приведения.
- Оператор static_cast.
- Оператор const_cast.
- Оператор reinterpret_cast.
- Приведение типов в старом стиле.
- Совет. Избегайте приведения типов.
- Упражнения раздела 4.11.3.
- 4.12. Таблица приоритетов операторов. ⇢
- Резюме. ⇢
- Термины. ⇢
- Глава 5. Операторы. ⇢
- 5.1. Простые операторы. ⇢
- Пустые операторы.
- Остерегайтесь пропущенных и лишних точек с запятой.
- Составные операторы (блоки).
- Упражнения раздела 5.1.
- 5.2. Операторная область видимости. ⇢
- Упражнения раздела 5.2.
- 5.3. Условные операторы. ⇢
- 5.3.1. Оператор if. ⇢
- Использование оператора if else.
- Вложенные операторы if.
- Следите за фигурными скобками.
- Потерянный оператор else.
- Контроль пути выполнения при помощи фигурных скобок.
- Упражнения раздела 5.3.1.
- 5.3.2. Оператор switch. ⇢
- Порядок выполнения в операторе switch.
- Пропуск оператора break — весьма распространенная ошибка.
- Метка default.
- Определение переменной в операторе switch.
- Упражнения раздела 5.3.2.
- 5.4. Итерационные операторы. ⇢
- 5.4.1. Оператор while. ⇢
- Использование цикла while.
- Упражнения раздела 5.4.1.
- 5.4.2. Традиционный оператор for. ⇢
- Поток выполнения в традиционном цикле for.
- Несколько определений в заголовке for.
- Пропуск частей заголовка for.
- Упражнения раздела 5.4.2.
- 5.4.3. Серийный оператор for. ⇢
- 5.4.4. Оператор do while. ⇢
- Упражнения раздела 5.4.4.
- 5.5. Операторы перехода. ⇢
- 5.5.1. Оператор break. ⇢
- Упражнения раздела 5.5.1.
- 5.5.2. Оператор continue. ⇢
- Упражнения раздела 5.5.2.
- 5.5.3. Оператор goto. ⇢
- Упражнения раздела 5.5.3.
- 5.6. Блоки try и обработка исключений. ⇢
- 5.6.1. Оператор throw. ⇢
- 5.6.2. Блок try. ⇢
- Создание обработчика.
- При поиске обработчика выполнение функций прерывается.
- Внимание! Написание устойчивого к исключениям кода — довольно сложная задача.
- 5.6.3. Стандартные исключения. ⇢
- Упражнения раздела 5.6.3.
- Резюме. ⇢
- Термины. ⇢
- Глава 6. Функции. ⇢
- 6.1. Основы функций. ⇢
- Создание функции.
- Вызов функции.
- Параметры и аргументы.
- Список параметров функции.
- Тип возвращаемого значения функции.
- Упражнения раздела 6.1.
- 6.1.1. Локальные объекты. ⇢
- Автоматические объекты.
- Локальные статические объекты.
- Упражнения раздела 6.1.1.
- 6.1.2. Объявление функций. ⇢
- Объявления функций находятся в файлах заголовка.
- Упражнения раздела 6.1.2.
- 6.1.3. Раздельная компиляция. ⇢
- Компиляция и компоновка нескольких файлов исходного кода.
- Упражнения раздела 6.1.3.
- 6.2. Передача аргументов. ⇢
- 6.2.1. Передача аргумента по значению. ⇢
- Параметры указателя.
- Упражнения раздела 6.2.1.
- 6.2.2. Передача аргумента по ссылке. ⇢
- Использование ссылки во избежание копирования.
- Использование ссылочных параметров для возвращения дополнительной информации.
- Упражнения раздела 6.2.2.
- 6.2.3. Константные параметры и аргументы. ⇢
- Параметры в виде указателей или ссылок и константность.
- По возможности используйте ссылки на константы.
- Упражнения раздела 6.2.3.
- 6.2.4. Параметры в виде массива. ⇢
- Использование маркера для определения продолжения массива.
- Использование соглашения стандартной библиотеки.
- Явная передача параметра размера.
- Параметры массива и константность.
- Ссылочный параметр массива.
- Передача многомерного массива.
- Упражнения раздела 6.2.4.
- 6.2.5. Функция main(): обработка параметров командной строки. ⇢
- Упражнения раздела 6.2.5.
- 6.2.6. Функции с переменным количеством параметров. ⇢
- Параметры типа initializer_list.
- Параметр в виде многоточия.
- Упражнения раздела 6.2.6.
- 6.3. Типы возвращаемого значения и оператор return. ⇢
- 6.3.1. Функции без возвращаемого значения. ⇢
- 6.3.2. Функции, возвращающие значение. ⇢
- Как возвращаются значения.
- Никогда не возвращайте ссылку на локальный объект.
- Функции, возвращающие типы класса и оператор вызова.
- Возвращаемая ссылка является l-значением.
- Списочная инициализация возвращаемого значения.
- Возвращение значения из функции main().
- Рекурсия.
- Упражнения раздела 6.3.2.
- 6.3.3. Возвращение указателя на массив. ⇢
- Объявление функции, возвращающей указатель на массив.
- Использование замыкающего типа возвращаемого значения.
- Использование спецификатора decltype.
- Упражнения раздела 6.3.3.
- 6.4. Перегруженные функции. ⇢
- Определение перегруженных функций.
- Различие типов параметров.
- Перегрузка и константные параметры.
- Совет. Когда не следует перегружать функции.
- Оператор const_cast и перегрузка.
- Вызов перегруженной функции.
- Упражнения раздела 6.4.
- 6.4.1. Перегрузка и область видимости. ⇢
- 6.5. Специальные средства. ⇢
- 6.5.1. Аргументы по умолчанию. ⇢
- Вызов функции с аргументами по умолчанию.
- Объявление аргумента по умолчанию.
- Инициализация аргумента по умолчанию.
- Упражнения раздела 6.5.1.
- 6.5.2. Встраиваемые функции и функции constexpr. ⇢
- Встраиваемые функции позволяют избежать дополнительных затрат на вызов.
- Функции constexpr.
- Помещайте встраиваемые функции и функции constexpr в файлы заголовка.
- Упражнения раздела 6.5.2.
- 6.5.3. Помощь в отладке. ⇢
- Макрос препроцессора assert.
- Переменная препроцессора NDEBUG.
- Упражнения раздела 6.5.3.
- 6.6. Подбор функции. ⇢
- Выявление кандидатов и подходящих функций.
- Поиск наилучшего соответствия, если он есть.
- Подбор перегруженной версии с несколькими параметрами.
- Упражнения раздела 6.6.
- 6.6.1. Преобразование типов аргументов. ⇢
- Соответствие, требующее приведения и (или) целочисленного преобразования.
- Соответствие функций и константные аргументы.
- Упражнения раздела 6.6.1.
- 6.7. Указатели на функции. ⇢
- Использование указателей на функцию.
- Указатели на перегруженные функции.
- Указатель на функцию как параметр.
- Возвращение указателя на функцию.
- Использование спецификаторов auto и decltype для типов указателей на функции.
- Упражнения раздела 6.7.
- Резюме. ⇢
- Термины. ⇢
- Глава 7. Классы. ⇢
- 7.1. Определение абстрактных типов данных. ⇢
- 7.1.1. Разработка класса Sales_data. ⇢
- Ключевая концепция. Различие в ролях программистов.
- Использование пересмотренного класса Sales_data.
- Упражнения раздела 7.1.1.
- 7.1.2. Определение пересмотренного класса Sales_data. ⇢
- Определение функций-членов.
- Указатель this.
- Константные функции-члены.
- Область видимости класса и функции-члены.
- Определение функции-члена вне класса.
- Определение функции, возвращающей указатель this на объект.
- Упражнения раздела 7.1.2.
- 7.1.3. Определение функций, не являющихся членом класса, но связанных с ним. ⇢
- Определение функций read() и print().
- Определение функции add().
- Упражнения раздела 7.1.3.
- 7.1.4. Конструкторы. ⇢
- Синтезируемый стандартный конструктор.
- Некоторые классы не могут полагаться на синтезируемый стандартный конструктор.
- Определение конструкторов класса Sales_data.
- Что значит = default.
- Список инициализации конструктора.
- Определение конструктора вне тела класса.
- Упражнения раздела 7.1.4.
- 7.1.5. Копирование, присвоение и удаление. ⇢
- Некоторые классы не могут полагаться на синтезируемые версии.
- 7.2. Управление доступом и инкапсуляция. ⇢
- Использование ключевых слов class и struct.
- Ключевая концепция. Преимущества инкапсуляции.
- Упражнения раздела 7.2.
- 7.2.1. Друзья. ⇢
- Объявление дружественных отношений.
- Упражнения раздела 7.2.1.
- 7.3. Дополнительные средства класса. ⇢
- 7.3.1. Снова о членах класса. ⇢
- Определение типов-членов.
- Функции-члены класса Screen.
- Встраиваемые члены класса.
- Перегрузка функций-членов.
- Изменяемые переменные-члены.
- Инициализаторы переменных-членов класса.
- Упражнения раздела 7.3.1.
- 7.3.2. Функции, возвращающие указатель *this. ⇢
- Возвращение *this из константной функции-члена.
- Перегрузка на основании константности.
- Совет. Используйте закрытые вспомогательные функции.
- Упражнения раздела 7.3.2.
- 7.3.3. Типы классов. ⇢
- Объявления класса.
- Упражнения раздела 7.3.3.
- 7.3.4. Снова о дружественных отношениях. ⇢
- Дружественные отношения между классами.
- Как сделать функцию-член дружественной.
- Перегруженные функции и дружественные отношения.
- Объявление дружественных отношений и область видимости.
- Упражнения раздела 7.3.4.
- 7.4. Область видимости класса. ⇢
- Область видимости и члены, определенные вне класса.
- Упражнения раздела 7.4.
- 7.4.1. Поиск имен в области видимости класса. ⇢
- Поиск имен для объявлений членов класса.
- Имена типов имеют особенности.
- При поиске имен в областях видимости члены класса следуют обычным правилам.
- После поиска в области видимости класса продолжается поиск в окружающей области видимости.
- Поиск имен распространяется по всему файлу, где они были применены.
- Упражнения раздела 7.4.1.
- 7.5. Снова о конструкторах. ⇢
- 7.5.1. Список инициализации конструктора. ⇢
- Иногда применение списка инициализации конструктора неизбежно.
- Совет. Используйте списки инициализации конструктора.
- Порядок инициализации переменных-членов класса.
- Аргументы по умолчанию и конструкторы.
- Упражнения раздела 7.5.1.
- 7.5.2. Делегирующий конструктор. ⇢
- Упражнения раздела 7.5.2.
- 7.5.3. Роль стандартного конструктора. ⇢
- Применение стандартного конструктора.
- Упражнения раздела 7.5.3.
- 7.5.4. Неявное преобразование типов класса. ⇢
- Допустимо только одно преобразование типов класса.
- Преобразования типов класса не всегда полезны.
- Предотвращение неявных преобразований, осуществляемых конструктором.
- Явные конструкторы применяются только для прямой инициализации.
- Применение явных конструкторов для преобразований.
- Библиотечные классы с явными конструкторами.
- Упражнения раздела 7.5.4.
- 7.5.5. Агрегатные классы. ⇢
- Упражнения раздела 7.5.5.
- 7.5.6. Литеральные классы. ⇢
- Конструкторы constexpr.
- Упражнения раздела 7.5.6.
- 7.6. Статические члены класса. ⇢
- Объявление статических членов.
- Использование статических членов класса.
- Определение статических членов.
- Инициализация статических переменных-членов в классе.
- Статические члены можно применять так, как нельзя применять обычные.
- Упражнения раздела 7.6.
- Резюме. ⇢
- Термины. ⇢
- Часть II. Библиотека С++ ⇢
- Глава 8. Библиотека ввода и вывода. ⇢
- 8.1. Классы ввода-вывода. ⇢
- Взаимоотношения между типами ввода и вывода.
- 8.1.1. Объекты ввода-вывода не допускают копирования и присвоения. ⇢
- 8.1.2. Флаги состояния. ⇢
- Опрос состояния потока.
- Управление флагами состояния.
- Упражнения раздела 8.1.2.
- 8.1.3. Управление буфером вывода. ⇢
- Сброс буфера вывода.
- Манипулятор unitbuf.
- Внимание! При сбое программы буфер не сбрасывается.
- Связывание потоков ввода и вывода.
- 8.2. Ввод и вывод в файл. ⇢
- 8.2.1. Использование объектов файловых потоков. ⇢
- Использование fstream вместо iostream&
- Функции-члены open() и close().
- Автоматическое создание и удаление.
- Упражнения раздела 8.2.1.
- 8.2.2. Режимы файла. ⇢
- Открытие файла в режиме out удаляет существующие данные.
- Режим файла устанавливается при каждом вызове функции open().
- Упражнения раздела 8.2.2.
- 8.3. Строковые потоки. ⇢
- 8.3.1. Использование класса istringstream. ⇢
- Упражнения раздела 8.3.1.
- 8.3.2. Использование класса ostringstream. ⇢
- Упражнения раздела 8.3.2.
- Резюме. ⇢
- Термины. ⇢
- Глава 9. Последовательные контейнеры. ⇢
- 9.1. Обзор последовательных контейнеров. ⇢
- Решение о том, какой последовательный контейнер использовать.
- Упражнения раздела 9.1.
- 9.2. Обзор библиотечных контейнеров. ⇢
- Ограничения на типы, которые может содержать контейнер.
- Упражнения раздела 9.2.
- 9.2.1. Итераторы. ⇢
- Диапазоны итераторов.
- Требования к итераторам, формирующим диапазон.
- Смысл использования диапазонов, включающих левый элемент.
- Упражнения раздела 9.2.1.
- 9.2.2. Типы-члены классов контейнеров. ⇢
- Упражнения раздела 9.2.2.
- 9.2.3. Функции-члены begin() и end(). ⇢
- Упражнения раздела 9.2.3.
- 9.2.4. Определение и инициализация контейнера. ⇢
- Инициализация контейнера как копии другого контейнера.
- Списочная инициализация.
- Конструкторы последовательных контейнеров, связанные с размером.
- Библиотечные массивы имеют фиксированный размер.
- Упражнения раздела 9.2.4.
- 9.2.5. Присвоение и функция swap(). ⇢
- Применение функции assign() (только последовательные контейнеры).
- Применение функции swap().
- Упражнения раздела 9.2.5.
- 9.2.6. Операции с размером контейнера. ⇢
- 9.2.7. Операторы сравнения. ⇢
- Упражнения раздела 9.2.7.
- 9.3. Операции с последовательными контейнерами. ⇢
- 9.3.1. Добавление элементов в последовательный контейнер. ⇢
- Применение функции push_back().
- Ключевая концепция. Элементы контейнера содержат копии значений.
- Применение функции push_front().
- Добавление элементов в указанную точку контейнера.
- Вставка диапазона элементов.
- Применение возвращаемого значения функции insert().
- Применение функций emplace().
- Упражнения раздела 9.3.1.
- 9.3.2. Доступ к элементам. ⇢
- Индексация и безопасный произвольный доступ.
- Упражнения раздела 9.3.2.
- 9.3.3. Удаление элементов. ⇢
- Применение функций pop_front() и pop_back().
- Удаление элемента в середине контейнера.
- Удаление нескольких элементов.
- Упражнения раздела 9.3.3.
- 9.3.4. Специализированные функции контейнера forward_list. ⇢
- Упражнения раздела 9.3.4.
- 9.3.5. Изменение размеров контейнера. ⇢
- Упражнения раздела 9.3.5.
- 9.3.6. Некоторые операции с контейнерами делают итераторы недопустимыми. ⇢
- Совет. Контроль итераторов.
- Создание циклов, которые изменяют контейнер.
- Не храните итератор, возвращенный функцией end().
- Упражнения раздела 9.3.6.
- 9.4. Как увеличивается размер вектора. ⇢
- Функции-члены управления емкостью.
- Функции-члены capacity() и size().
- Упражнения раздела 9.4.
- 9.5. Дополнительные операции со строками. ⇢
- 9.5.1. Дополнительные способы создания строк. ⇢
- Функция substr().
- Упражнения раздела 9.5.1.
- 9.5.2. Другие способы изменения строки. ⇢
- Функции append() и replace().
- Множество способов изменить строку.
- Упражнения раздела 9.5.2.
- 9.5.3. Операции поиска строк. ⇢
- Откуда начинать поиск.
- Поиск в обратном направлении.
- Упражнения раздела 9.5.3.
- 9.5.4. Сравнение строк. ⇢
- 9.5.5. Числовые преобразования. ⇢
- Упражнения раздела 9.5.5.
- 9.6. Адаптеры контейнеров. ⇢
- Определение адаптера.
- Адаптер stack.
- Адаптеры очередей.
- Упражнения раздела 9.6.
- Резюме. ⇢
- Термины. ⇢
- Глава 10. Обобщенные алгоритмы. ⇢
- 10.1. Краткий обзор. ⇢
- Как работают алгоритмы.
- Итераторы делают алгоритмы независимыми от типа контейнера…
- …но алгоритмы зависят от типа элементов.
- Упражнения раздела 10.1.
- Ключевая концепция. Алгоритмы никогда не используют функции контейнеров.
- 10.2. Первый взгляд на алгоритмы. ⇢
- 10.2.1. Алгоритмы только для чтения. ⇢
- Алгоритмы и типы элементов.
- Алгоритмы, работающие с двумя последовательностями.
- Упражнения раздела 10.2.1.
- Ключевая концепция. Итераторы, передаваемые в качестве аргументов.
- 10.2.2. Алгоритмы, записывающие элементы контейнера. ⇢
- Алгоритмы не проверяют операции записи.
- Функция back_inserter().
- Алгоритм copy().
- 10.2.3. Алгоритмы, переупорядочивающие элементы контейнера. ⇢
- Устранение дубликатов.
- Алгоритм unique().
- Применение функций контейнера для удаления элементов.
- Упражнения раздела 10.2.3.
- 10.3. Перенастройка функций. ⇢
- 10.3.1. Передача функций алгоритму. ⇢
- Предикаты.
- Алгоритмы сортировки.
- Упражнения раздела 10.3.1.
- 10.3.2. Лямбда-выражения. ⇢
- Знакомство с лямбда-выражением.
- Передача аргументов лямбда-выражению.
- Использование списка захвата.
- Вызов функции find_if().
- Алгоритм for_each().
- Объединив все вместе.
- Упражнения раздела 10.3.2.
- 10.3.3. Захват и возвращение значений лямбда-выражениями. ⇢
- Захват по значению.
- Захват по ссылке.
- Совет. Не усложняйте списки захвата лямбда-выражений.
- Неявный захват.
- Изменяемые лямбда-выражения.
- Определение типа возвращаемого значения лямбда-выражения.
- Упражнения раздела 10.3.3.
- 10.3.4. Привязка аргументов. ⇢
- Библиотечная функция bind().
- Привязка параметра sz к функции check_size().
- Использование имен из пространства имен placeholders.
- Аргументы функции bind().
- Использование функции bind() для переупорядочивания параметров.
- Привязка ссылочных параметров.
- Совместимость с прежней версией: привязка аргументов.
- Упражнения раздела 10.3.4.
- 10.4. Возвращаясь к итераторам. ⇢
- 10.4.1. Итераторы вставки. ⇢
- Упражнения раздела 10.4.1.
- 10.4.2. Потоковые итераторы. ⇢
- Использование итератора istream_iterator.
- Использование потоковых итераторов с алгоритмами.
- Итераторы istream_iterator позволяют использовать ленивое вычисление.
- Использование итератора ostream_iterator.
- Использование потоковых итераторов с типами класса.
- Упражнения раздела 10.4.2.
- 10.4.3. Реверсивные итераторы. ⇢
- Реверсивным итераторам необходим оператор декремента.
- Отношения между реверсивными и другими итераторами.
- Упражнения раздела 10.4.3.
- 10.5. Структура обобщенных алгоритмов. ⇢
- 10.5.1. Пять категорий итераторов. ⇢
- Категории итераторов.
- Упражнения раздела 10.5.1.
- 10.5.2. Параметрическая схема алгоритмов. ⇢
- Алгоритмы с одним итератором назначения.
- Алгоритмы с двумя итераторами, указывающими исходную последовательность.
- 10.5.3. Соглашения об именовании алгоритмов. ⇢
- Некоторые алгоритмы используют перегруженные версии для передачи предиката.
- Алгоритмы с версиями _if.
- Различия между копирующими и не копирующими версиями.
- Упражнения раздела 10.5.3.
- 10.6. Алгоритмы, специфические для контейнеров. ⇢
- Алгоритм-член splice().
- Специфические для списка функции, изменяющие контейнер.
- Упражнения раздела 10.6.
- Резюме. ⇢
- Термины. ⇢
- Глава 11. Ассоциативные контейнеры. ⇢
- 11.1. Использование ассоциативных контейнеров. ⇢
- Использование контейнера map.
- Использование контейнера set.
- Упражнения раздела 11.1.
- 11.2. Обзор ассоциативных контейнеров. ⇢
- 11.2.1. Определение ассоциативного контейнера. ⇢
- Инициализация контейнеров multimap и multiset.
- Упражнения раздела 11.2.1.
- 11.2.2. Требования к типу ключа. ⇢
- Типы ключей упорядоченных контейнеров.
- Использование функции сравнения для типа ключа.
- Упражнения раздела 11.2.2.
- 11.2.3. Тип pair. ⇢
- Функция для создания объектов типа pair.
- Упражнения раздела 11.2.3.
- 11.3. Работа с ассоциативными контейнерами. ⇢
- 11.3.1. Итераторы ассоциативных контейнеров. ⇢
- Итераторы наборов константны.
- Перебор ассоциативного контейнера.
- Ассоциативные контейнеры и алгоритмы.
- Упражнения раздела 11.3.1.
- 11.3.2. Добавление элементов. ⇢
- Добавление элементов в карту.
- Проверка значения, возвращаемого функцией insert().
- Еще раз о синтаксисе.
- Добавление элементов в контейнеры multiset и multimap.
- Упражнения раздела 11.3.2.
- 11.3.3. Удаление элементов. ⇢
- 11.3.4. Индексация карт. ⇢
- Использование значения, возвращенного оператором индексирования.
- Упражнения раздела 11.3.4.
- 11.3.5. Доступ к элементам. ⇢
- Использование функции find() вместо индексирования карт.
- Поиск элементов в контейнерах multimap и multiset.
- Другое решение на основании итератора.
- Функция equal_range().
- Упражнения раздела 11.3.5.
- 11.3.6. Карта преобразования слов. ⇢
- Программа преобразования слова.
- Создание карты преобразования.
- Осуществление преобразования.
- Упражнения раздела 11.3.6.
- 11.4. Неупорядоченные контейнеры. ⇢
- Использование неупорядоченного контейнера.
- Управление ячейками.
- Требования к типу ключа неупорядоченных контейнеров.
- Упражнения раздела 11.4.
- Резюме. ⇢
- Термины. ⇢
- Глава 12. Динамическая память. ⇢
- 12.1. Динамическая память и интеллектуальные указатели. ⇢
- 12.1.1. Класс shared_ptr. ⇢
- Функция make_shared().
- Копирование и присвоение указателей shared_ptr.
- Указатель shared_ptr автоматически удаляет свои объекты…
- …и автоматически освобождает их память.
- Классы, ресурсы которых имеют динамическую продолжительность существования.
- Определение класса StrBlob.
- Конструкторы класса StrBlob.
- Функции-члены доступа к элементам.
- Копирование, присвоение и удаление объектов класса StrBlob.
- Упражнения раздела 12.1.1.
- 12.1.2. Непосредственное управление памятью. ⇢
- Использование оператора new для динамического резервирования и инициализации объектов.
- Динамически созданные константные объекты.
- Исчерпание памяти.
- Освобождение динамической памяти.
- Значения указателя и оператор delete.
- Динамически созданные объекты существуют до тех пор, пока не будут освобождены.
- Внимание! Управление динамической памятью подвержено ошибкам.
- Переустановка значения указателя после удаления…
- …обеспечивает лишь частичную защиту.
- Упражнения раздела 12.1.2.
- 12.1.3. Использование указателя shared_ptr с оператором new. ⇢
- Не смешивайте обычные указатели с интеллектуальными.
- Другие операции с указателем shared_ptr.
- Упражнения раздела 12.1.3.
- 12.1.4. Интеллектуальные указатели и исключения. ⇢
- Интеллектуальные указатели и классы без деструкторов.
- Использование собственного кода удаления.
- Внимание! Проблемы интеллектуального указателя.
- Упражнения раздела 12.1.4.
- 12.1.5. Класс unique_ptr. ⇢
- Передача и возвращение указателя unique_ptr.
- Совместимость с прежней версией: класс auto_ptr.
- Передача функции удаления указателю unique_ptr.
- Упражнения раздела 12.1.5.
- 12.1.6. Класс weak_ptr. ⇢
- Проверяемый класс указателя.
- Операции с указателями.
- Упражнения раздела 12.1.6.
- 12.2. Динамические массивы. ⇢
- 12.2.1. Оператор new и массивы. ⇢
- Резервирование массива возвращает указатель на тип элемента.
- Инициализация массива динамически созданных объектов.
- Динамическое резервирование пустого массива вполне допустимо.
- Освобождение динамических массивов.
- Интеллектуальные указатели и динамические массивы.
- Упражнения раздела 12.2.1.
- 12.2.2. Класс allocator. ⇢
- Класс allocator и специальные алгоритмы.
- Класс allocator резервирует незаполненную память.
- Алгоритмы копирования и заполнения неинициализированной памяти.
- Упражнения раздела 12.2.2.
- 12.3. Использование библиотеки: программа запроса текста. ⇢
- 12.3.1. Проект программы. ⇢
- Структуры данных.
- Совместное использование данных классами.
- Применение класса TextQuery.
- Упражнения раздела 12.3.1.
- 12.3.2. Определение классов программы запросов. ⇢
- Конструктор TextQuery().
- Класс QueryResult.
- Функция query().
- Вывод результатов.
- Упражнения раздела 12.3.2.
- Резюме. ⇢
- Термины. ⇢
- Часть III. Инструменты для разработчиков классов. ⇢
- Глава 13. Управление копированием. ⇢
- 13.1. Копирование, присвоение и удаление. ⇢
- 13.1.1. Конструктор копий. ⇢
- Синтезируемый конструктор копий.
- Инициализация копией.
- Параметры и возвращаемые значения.
- Ограничения на инициализацию копией.
- Компилятор может обойти конструктор копий.
- Упражнения раздела 13.1.1.
- 13.1.2. Оператор присвоения копии. ⇢
- Перегруженный оператор присвоения.
- Синтезируемый оператор присвоения копии.
- Упражнения раздела 13.1.2.
- 13.1.3. Деструктор. ⇢
- Что делает деструктор.
- Когда происходит вызов деструктора.
- Синтезируемый деструктор.
- Упражнения раздела 13.1.3.
- 13.1.4. Правило три/пять. ⇢
- Классы, нуждающиеся в деструкторах, нуждаются в копировании и присвоении.
- Классы, нуждающиеся в копировании, нуждаются также в присвоении, и наоборот.
- Упражнения раздела 13.1.4.
- 13.1.5. Использование спецификатора = default. ⇢
- 13.1.6. Предотвращение копирования. ⇢
- Определение функции как удаленной.
- Деструктор не должен быть удаленной функцией-членом.
- Функции-члены управления копированием могут быть синтезированы как удаленные.
- Закрытые функции управления копированием.
- Упражнения раздела 13.1.6.
- 13.2. Управление копированием и ресурсами. ⇢
- Упражнения раздела 13.2.
- 13.2.1. Классы, действующие как значения. ⇢
- Подобный значению оператор присвоения копии.
- Ключевая концепция. Операторы присвоения.
- Упражнения раздела 13.2.1.
- 13.2.2. Определение классов, действующих как указатели. ⇢
- Счетчики ссылок.
- Определение класса счетчика ссылок.
- Функции-члены копирования подобного указателю класса используют счетчик ссылок.
- Упражнения раздела 13.2.2.
- 13.3. Функция swap(). ⇢
- Написание собственной функции swap().
- Функции swap() должны вызвать функции swap(), а не std::swap().
- Использование функции swap() в операторах присвоения.
- Упражнения раздела 13.3.
- 13.4. Пример управления копированием. ⇢
- Класс Message.
- Функции-члены save() и remove().
- Управление копированием класса Message.
- Деструктор класса Message.
- Оператор присвоения копии класса Message.
- Функция swap() класса Message.
- Упражнения раздела 13.4.
- 13.5. Классы, управляющие динамической памятью. ⇢
- Проект класса StrVec.
- Определение класса StrVec.
- Использование функции-члена construct().
- Функция-член alloc_n_copy().
- Функция-член free().
- Функции-члены управления копированием.
- Перемещение, а не копирование элементов при резервировании.
- Конструктор перемещения и функция std::move().
- Функция-член reallocate().
- Упражнения раздела 13.5.
- 13.6. Перемещение объектов. ⇢
- 13.6.1. Ссылки на r-значение. ⇢
- l-значения — устойчивы; r-значения — эфемерны.
- Переменные являются l-значениями.
- Библиотечная функция move().
- Упражнения раздела 13.6.1.
- 13.6.2. Конструктор перемещения и присваивание при перемещении. ⇢
- Операции перемещения, библиотечные контейнеры и исключения.
- Оператор присваивания при перемещении.
- Исходный объект перемещения должен быть в удаляемом состоянии.
- Синтезируемые функции перемещения.
- R-значения перемещаются, а l-значения копируются…
- …но r-значения копируются, если нет конструктора перемещения.
- Операторы присвоения копии и обмена и перемещение.
- Совет. Обновленное правило трех.
- Функции перемещения для класса Message.
- Итераторы перемещения.
- Совет. Не слишком спешите с перемещением.
- Упражнения раздела 13.6.2.
- 13.6.3. Ссылки на r-значение и функции-члены. ⇢
- Ссылки на l-значения, r-значения и функции-члены.
- Перегрузка и ссылочные функции.
- Упражнения раздела 13.6.3.
- Резюме. ⇢
- Термины. ⇢
- Глава 14. Перегрузка операторов и преобразований. ⇢
- 14.1. Фундаментальные концепции. ⇢
- Непосредственный вызов функции перегруженного оператора.
- Некоторые операторы не следует перегружать.
- Использование определений, совместимых со встроенным смыслом.
- Составные операторы присвоения.
- Внимание! Будьте осторожны при использовании перегруженных операторов.
- Выбор обычной функции или члена класса.
- Упражнения раздела 14.1.
- 14.2. Операторы ввода и вывода. ⇢
- 14.2.1. Перегрузка оператора вывода << ⇢
- Оператор вывода класса Sales_data.
- Операторы вывода обеспечивают минимум форматирования.
- Операторы ввода-вывода не должны быть функциями-членами класса.
- Упражнения раздела 14.2.1.
- 14.2.2. Перегрузка оператора ввода >> ⇢
- Оператор ввода класса Sales_data.
- Ошибки во время ввода.
- Оповещение об ошибке.
- Упражнения раздела 14.2.2.
- 14.3. Арифметические операторы и операторы отношения. ⇢
- Упражнения раздела 14.3.
- 14.3.1. Операторы равенства. ⇢
- Упражнения раздела 14.3.1.
- 14.3.2. Операторы отношения. ⇢
- Упражнения раздела 14.3.2.
- 14.4. Операторы присвоения. ⇢
- Составные операторы присвоения.
- Упражнения раздела 14.4.
- 14.5. Оператор индексирования. ⇢
- Упражнения раздела 14.5.
- 14.6. Операторы инкремента и декремента. ⇢
- Определение префиксных версий операторов инкремента и декремента.
- Дифференциация префиксных и постфиксных операторов.
- Явный вызов постфиксных операторов.
- Упражнения раздела 14.6.
- 14.7. Операторы доступа к членам. ⇢
- Ограничения на возвращаемое значение оператора стрелки.
- Упражнения раздела 14.7.
- 14.8. Оператор вызова функции. ⇢
- Классы объектов функций с состоянием.
- Упражнения раздела 14.8.
- 14.8.1. Лямбда-выражения — объекты функции. ⇢
- Классы, представляющие лямбда-выражения с захваченными переменными.
- Упражнения раздела 14.8.1.
- 14.8.2. Библиотечные объекты функций. ⇢
- Применение библиотечного объекта функции с алгоритмами.
- Упражнения раздела 14.8.2.
- 14.8.3. Вызываемые объекты и тип function. ⇢
- Разные типы могут иметь одинаковую сигнатуру вызова.
- Библиотечный тип function.
- Перегруженные функции и тип function.
- Упражнения раздела 14.8.3.
- 14.9. Перегрузка, преобразование и операторы. ⇢
- 14.9.1. Операторы преобразования. ⇢
- Определение класса с оператором преобразования.
- Внимание! Не злоупотребляйте функциями преобразования.
- Операторы преобразования могут привести к удивительным результатам.
- Явный оператор преобразования.
- Преобразование в тип bool.
- Упражнения раздела 14.9.1.
- 14.9.2. Избегайте неоднозначных преобразований. ⇢
- Распознавание аргумента и взаимные преобразования.
- Двусмысленность и множественность путей преобразования во встроенные типы.
- Перегруженные функции и конструкторы преобразования.
- Внимание! Преобразования и операторы.
- Перегруженные функции и пользовательские преобразования.
- Упражнения раздела 14.9.2.
- 14.9.3. Подбор функций и перегруженные операторы. ⇢
- Упражнения раздела 14.9.3.
- Резюме. ⇢
- Термины. ⇢
- Глава 15. Объектно-ориентированное программирование. ⇢
- 15.1. Краткий обзор ООП. ⇢
- Наследование.
- Динамическое связывание.
- 15.2. Определение базовых и производных классов. ⇢
- 15.2.1. Определение базового класса. ⇢
- Функции-члены и наследование.
- Управление доступом и наследование.
- Упражнения раздела 15.2.1.
- 15.2.2. Определение производного класса. ⇢
- Виртуальные функции в производном классе.
- Объекты производного класса и преобразование производного в базовый.
- Конструкторы производного класса.
- Использование членов базового класса из производного.
- Ключевая концепция. Соблюдение интерфейса базового класса.
- Наследование и статические члены.
- Объявления производных классов.
- Классы, используемые как базовые.
- Предотвращение наследования.
- Упражнения раздела 15.2.2.
- 15.2.3. Преобразования и наследование. ⇢
- Статический и динамический типы.
- Не существует неявного преобразования из базового типа в производный…
- …и нет преобразований между объектами.
- Ключевая концепция. Преобразования между типами, связанными наследованием.
- Упражнения раздела 15.2.3.
- 15.3. Виртуальные функции. ⇢
- Вызовы виртуальной функции могут быть распознаны во время выполнения.
- Ключевая концепция. Полиморфизм в языке С++
- Виртуальные функции в производном классе.
- Спецификаторы final и override.
- Виртуальные функции и аргументы по умолчанию.
- Хитрость виртуального механизма.
- Упражнения раздела 15.3.
- 15.4. Абстрактные базовые классы. ⇢
- Чистые виртуальные функции.
- Классы с чистыми виртуальными функциями являются абстрактными.
- Конструктор производного класса инициализирует только свой прямой базовый класс.
- Ключевая концепция. Рефакторинг.
- Упражнения раздела 15.4.
- 15.5. Управление доступом и наследование. ⇢
- Защищенные члены.
- Открытое, закрытое и защищенное наследование.
- Доступность преобразования производного класса в базовый класс.
- Ключевая концепция. Проект класса и защищенные члены.
- Дружественные отношения и наследование.
- Освобождение индивидуальных членов.
- Уровни защиты наследования по умолчанию.
- Упражнения раздела 15.5.
- 15.6. Область видимости класса при наследовании. ⇢
- Поиск имен осуществляется во время компиляции.
- Конфликт имен и наследование.
- Применение оператора области видимости для доступа к скрытым членам.
- Ключевая концепция. Поиск имени и наследование.
- Как обычно, поиск имени осуществляется перед проверкой соответствия типов.
- Виртуальные функции и область видимости.
- Вызов скрытой виртуальной функции через базовый класс.
- Переопределение перегруженных функций.
- Упражнения раздела 15.6.
- 15.7. Конструкторы и функции управления копированием. ⇢
- 15.7.1. Виртуальные деструкторы. ⇢
- Виртуальный деструктор отменяет синтез функций перемещения.
- Упражнения раздела 15.7.1.
- 15.7.2. Синтезируемые функции управления копированием и наследование. ⇢
- Базовые классы и удаленные функции управления копированием в производном классе.
- Функции перемещения и наследование.
- Упражнения раздела 15.7.2.
- 15.7.3. Функции-члены управления копированием производного класса. ⇢
- Определение конструктора копии или перемещения производного класса.
- Оператор присвоения производного класса.
- Деструктор производного класса.
- Вызовы виртуальных функций в конструкторах и деструкторах.
- Упражнения раздела 15.7.3.
- 15.7.4. Унаследованные конструкторы. ⇢
- Характеристики унаследованного конструктора.
- Упражнения раздела 15.7.4.
- 15.8. Контейнеры и наследование. ⇢
- Помещайте в контейнеры указатели (интеллектуальные), а не объекты.
- Упражнения раздела 15.8.
- 15.8.1. Разработка класса Basket. ⇢
- Определение членов класса Basket.
- Сокрытие указателей.
- Имитация виртуального копирования.
- Упражнения раздела 15.8.1.
- 15.9. Возвращаясь к запросам текста. ⇢
- 15.9.1. Объектно-ориентированное решение. ⇢
- Абстрактный базовый класс.
- Ключевая концепция. Наследование или композиция.
- Сокрытие иерархии в классе интерфейса.
- Как работают эти классы.
- Упражнения раздела 15.9.1.
- 15.9.2. Классы Query_base и Query. ⇢
- Класс Query.
- Оператор вывода класса Query.
- Упражнения раздела 15.9.2.
- 15.9.3. Производные классы. ⇢
- Класс WordQuery.
- Класс NotQuery и оператор ~
- Класс BinaryQuery.
- Классы AndQuery, OrQuery и их операторы.
- Упражнения раздела 15.9.3.
- 15.9.4. Виртуальные функции eval(). ⇢
- Функция OrQuery::eval().
- Функция AndQuery::eval().
- Функция NotQuery::eval().
- Упражнения раздела 15.9.4.
- Резюме. ⇢
- Термины. ⇢
- Глава 16. Шаблоны и обобщенное программирование. ⇢
- 16.1. Определение шаблона. ⇢
- 16.1.1. Шаблоны функций. ⇢
- Создание экземпляра шаблона функции.
- Параметры типа шаблона.
- Параметры значения шаблона.
- Шаблоны функции со спецификаторами inline и constexpr.
- Создание кода, независимого от типа.
- Компиляция шаблона.
- Ключевая концепция. Шаблоны и заголовки.
- Ошибки компиляции проявляются, главным образом, во время создания экземпляра.
- Упражнения раздела 16.1.1.
- 16.1.2. Шаблоны класса. ⇢
- Определение шаблона класса.
- Создание экземпляра шаблона класса.
- Ссылки на тип шаблона в пределах шаблона.
- Функции-члены шаблонов класса.
- Функция check() и функции доступа к членам.
- Конструкторы Blob().
- Создание функций-членов шаблона класса.
- Упрощение использования имени шаблона класса в коде класса.
- Использование имени шаблона класса вне тела шаблона.
- Шаблоны классов и дружественные отношения.
- Дружественные отношения "один к одному".
- Общие и специфические дружественные отношения шаблонов.
- Объявление параметра типа шаблона дружественным.
- Псевдонимы типа шаблона.
- Статические члены шаблонов класса.
- Упражнения раздела 16.1.2.
- 16.1.3. Параметры шаблона. ⇢
- Параметры шаблона и область видимости.
- Объявления шаблона.
- Использование членов типа.
- Аргументы шаблона по умолчанию.
- Аргументы по умолчанию шаблона и шаблоны класса.
- Упражнения раздела 16.1.3.
- 16.1.4. Шаблоны-члены. ⇢
- Шаблоны-члены обычных (не шаблонных) классов.
- Шаблоны-члены шаблонов класса.
- Создание экземпляров и шаблоны-члены.
- Упражнения раздела 16.1.4.
- 16.1.5. Контроль создания экземпляра. ⇢
- Определения экземпляров создают экземпляры всех членов.
- Упражнения раздела 16.1.5.
- 16.1.6. Эффективность и гибкость. ⇢
- Привязка функции удаления во время выполнения.
- Привязка функции удаления во время компиляции.
- Упражнения раздела 16.1.6.
- 16.2. Дедукция аргумента шаблона. ⇢
- 16.2.1. Преобразования и параметры типа шаблона. ⇢
- Параметры функций с одинаковым типом параметра шаблона.
- Обычные преобразования применимы к обычным аргументам.
- Упражнения раздела 16.2.1.
- 16.2.2. Явные аргументы шаблона функции. ⇢
- Определение явного аргумента шаблона.
- Нормальные преобразования применимы к аргументам, определенным явно.
- Упражнения раздела 16.2.2.
- 16.2.3. Замыкающие типы возвращаемого значения и трансформация типа. ⇢
- Трансформация типа классов библиотечных шаблонов.
- Упражнения раздела 16.2.3.
- 16.2.4. Указатели на функцию и дедукция аргумента. ⇢
- 16.2.5. Дедукция аргумента шаблона и ссылки. ⇢
- Дедукция типа из параметров ссылки на l-значения функций.
- Дедукция типа из параметров ссылки на r-значения функций.
- Сворачивание ссылок и параметры ссылок на r-значения.
- Шаблоны функций с параметрами ссылки на r-значения.
- Упражнения раздела 16.2.5.
- 16.2.6. Функция std::move(). ⇢
- Как определена функция std::move().
- Как работает функция std::move().
- Оператор static_cast поддерживает приведение l-значения к ссылке на r-значение.
- Упражнения раздела 16.2.6.
- 16.2.7. Перенаправление. ⇢
- Определение параметров функции, хранящих информацию типа.
- Использование функции std::forward() для сохранения информации типа в вызове.
- Упражнения раздела 16.2.7.
- 16.3. Перегрузка и шаблоны. ⇢
- Создание перегруженных шаблонов.
- Несколько подходящих шаблонов.
- Не шаблон и перегрузка шаблона.
- Перегруженные шаблоны и преобразования.
- Пропуск объявления может нарушить программу.
- Упражнения раздела 16.3.
- 16.4. Шаблоны с переменным количеством аргументов. ⇢
- Оператор sizeof...
- Упражнения раздела 16.4.
- 16.4.1. Шаблоны функции с переменным количеством аргументов. ⇢
- Упражнения раздела 16.4.1.
- 16.4.2. Развертывание пакета. ⇢
- Концепция развертывания пакета.
- Упражнения раздела 16.4.2.
- 16.4.3. Перенаправление пакетов параметров. ⇢
- Совет. Перенаправление и шаблоны с переменным количеством аргументов.
- Упражнения раздела 16.4.3.
- 16.5. Специализация шаблона. ⇢
- Специализация шаблона функции.
- Перегрузка функций или специализация шаблона.
- Ключевая концепция. Обычные правила области видимости относятся и к специализации.
- Специализация шаблона класса.
- Частичная специализация шаблона класса.
- Специализация членов, но не класса.
- Упражнения раздела 16.5.
- Резюме. ⇢
- Термины. ⇢
- Часть IV. Дополнительные темы. ⇢
- Глава 17. Специализированные средства библиотек. ⇢
- 17.1. Тип tuple. ⇢
- 17.1.1. Определение и инициализация кортежей. ⇢
- Доступ к членам кортежа.
- Операторы сравнения и равенства.
- Упражнения раздела 17.1.1.
- 17.1.2. Использование кортежей для возвращения нескольких значений. ⇢
- Функция, возвращающая кортеж.
- Использование возвращенного функцией кортежа.
- Упражнения раздела 17.1.2.
- 17.2. Тип bitset. ⇢
- 17.2.1. Определение и инициализация наборов битов. ⇢
- Инициализация набора битов беззнаковым значением.
- Инициализация набора битов из строки.
- Упражнения раздела 17.2.1.
- 17.2.2. Операции с наборами битов. ⇢
- Возвращение значений из набора битов.
- Операторы ввода-вывода типа bitset.
- Использование наборов битов.
- Упражнения раздела 17.2.2.
- 17.3. Регулярные выражения. ⇢
- 17.3.1. Использование библиотеки регулярных выражений. ⇢
- Определение параметров объекта regex.
- Ошибки в определении и использовании регулярного выражения.
- Совет. Избегайте создания ненужных регулярных выражений.
- Классы регулярного выражения и тип исходной последовательности.
- Упражнения раздела 17.3.1.
- 17.3.2. Типы итераторов классов соответствия и regex. ⇢
- Использование итератора sregex_iterator.
- Использование данных соответствия.
- Упражнения раздела 17.3.2.
- 17.3.3. Использование подвыражений. ⇢
- Подвыражения для проверки правильности данных.
- Операции с типом соответствия.
- Упражнения раздела 17.3.3.
- 17.3.4. Использование функции regex_replace(). ⇢
- Замена только части исходной последовательности.
- Флаги, контролирующие соответствия и формат.
- Использование флагов формата.
- Упражнения раздела 17.3.4.
- 17.4. Случайные числа. ⇢
- 17.4.1. Процессоры случайных чисел и распределения. ⇢
- Типы распределения и процессоры.
- Сравнение процессора случайных чисел и функции rand().
- Процессоры создают последовательности чисел.
- Начальное число генератора.
- Упражнения раздела 17.4.1.
- 17.4.2. Другие виды распределений. ⇢
- Создание случайных вещественных чисел.
- Использование типа по умолчанию для результата распределения.
- Создание чисел с неравномерным распределением.
- Класс bernoulli_distribution.
- Упражнения раздела 17.4.2.
- 17.5. Еще о библиотеке ввода и вывода. ⇢
- 17.5.1. Форматированный ввод и вывод. ⇢
- Большинство манипуляторов изменяет флаг формата.
- Контроль формата логических значений.
- Определение базы целочисленных значений.
- Индикация базы числа в выводе.
- Контроль формата значений с плавающей точкой.
- Определение точности.
- Определение формы записи чисел с плавающей запятой.
- Вывод десятичной точки.
- Дополнение вывода.
- Контроль формата ввода.
- Упражнения раздела 17.5.1.
- 17.5.2. Не форматированные операции ввода-вывода. ⇢
- Однобайтовые операции.
- Возвращение во входной поток.
- Возвращение значения типа int из операций ввода.
- Внимание! Низкоуровневые функции подвержены ошибкам.
- Многобайтовые операции.
- Определение количества читаемых символов.
- Упражнения раздела 17.5.2.
- 17.5.3. Произвольный доступ к потоку. ⇢
- Функции установки и сообщения.
- Существует только один маркер.
- Перемещение маркера.
- Доступ к маркеру.
- Чтение и запись в тот же файл.
- Упражнения раздела 17.5.3.
- Резюме. ⇢
- Термины. ⇢
- Глава 18. Инструменты для крупномасштабных программ. ⇢
- 18.1. Обработка исключений. ⇢
- 18.1.1. Передача исключений. ⇢
- Прокрутка стека.
- Объекты автоматически удаляются при прокрутке стека.
- Деструкторы и исключения.
- Объект исключения.
- Упражнения раздела 18.1.1.
- 18.1.2. Обработка исключения. ⇢
- Поиск соответствующего обработчика.
- Повторная передача исключения.
- Обработчик для всех исключений.
- Упражнения раздела 18.1.2.
- 18.1.3. Блок try функции и конструкторы. ⇢
- Упражнения раздела 18.1.3.
- 18.1.4. Спецификатор исключения noexcept. ⇢
- Нарушение спецификации исключения.
- Совместимость с прежней версией. Спецификации исключения.
- Аргументы спецификации noexcept.
- Оператор noexcept.
- Спецификации исключения и указатели, виртуальные функции, функции управления копированием.
- Упражнения раздела 18.1.4.
- 18.1.5. Иерархии классов исключений. ⇢
- Классы исключения для приложения книжного магазина.
- Использование собственных типов исключений.
- Упражнения раздела 18.1.5.
- 18.2. Пространства имен. ⇢
- 18.2.1. Определение пространств имен. ⇢
- Каждое пространство имен является областью видимости.
- Пространства имен могут быть разобщены.
- Определение пространства имен cplusplus_primer.
- Определение членов пространства имен.
- Специализация шаблона.
- Глобальное пространство имен.
- Вложенные пространства имен.
- Встраиваемые пространства имен.
- Безымянные пространства имен.
- Безымянные пространства имен вместо статических файловых объектов.
- Упражнения раздела 18.2.1.
- 18.2.2. Использование членов пространства имен. ⇢
- Псевдонимы пространства имен.
- Объявления using (напоминание).
- Директива using.
- Директива using и область видимости.
- Пример директив using.
- Заголовки и объявления using или директивы.
- Внимание! Избегайте директив using.
- Упражнения раздела 18.2.2.
- 18.2.3. Классы, пространства имен и области видимости. ⇢
- Зависимый от аргумента поиск и параметры типа класса.
- Поиск и функции std::move() и std::forward().
- Дружественные объявления и зависимый от аргумента поиск.
- Упражнения раздела 18.2.3.
- 18.2.4. Перегрузка и пространства имен. ⇢
- Зависимый от аргумента поиск и перегрузка.
- Перегрузка и объявления using.
- Перегрузка и директивы using.
- Перегрузка при нескольких директивах using.
- Упражнения раздела 18.2.4.
- 18.3. Множественное и виртуальное наследование. ⇢
- 18.3.1. Множественное наследование. ⇢
- При множественном наследовании классы наследуют состояние каждого из базовых классов.
- Конструкторы производного класса инициализируют все объекты базовых классов.
- Унаследованные конструкторы и множественное наследование.
- Деструкторы и множественное наследование.
- Функции копирования и перемещения при множественном наследовании.
- Упражнения раздела 18.3.1.
- 18.3.2. Преобразования и несколько базовых классов. ⇢
- Поиск на основании типа указателя или ссылки.
- Упражнения раздела 18.3.2.
- 18.3.3. Область видимости класса при множественном наследовании. ⇢
- Упражнения раздела 18.3.3.
- Код для упражнений раздела 18.3.3.
- 18.3.4. Виртуальное наследование. ⇢
- Разные классы Panda.
- Использование виртуального базового класса.
- Для базовых классов поддерживаются стандартные преобразования.
- Видимость членов виртуальных базовых классов.
- Упражнения раздела 18.3.4.
- 18.3.5. Конструкторы и виртуальное наследование. ⇢
- Как создается объект при виртуальном наследовании.
- Порядок выполнения конструкторов и деструкторов.
- Упражнения раздела 18.3.5.
- Резюме. ⇢
- Термины. ⇢
- Глава 19. Специализированные инструменты и технологии. ⇢
- 19.1. Контроль распределения памяти. ⇢
- 19.1.1. Перегрузка операторов new и delete. ⇢
- Интерфейс функций operator new() и operator delete().
- Терминология. Выражение new или функция operator new().
- Функции malloc() и free().
- Упражнения раздела 19.1.1.
- 19.1.2. Размещающий оператор new. ⇢
- Явный вызов деструктора.
- 19.2. Идентификация типов времени выполнения. ⇢
- 19.2.1. Оператор dynamic_cast. ⇢
- Приведение dynamic_cast для типа указателя.
- Приведение dynamic_cast для типа ссылки.
- Упражнения раздела 19.2.1.
- 19.2.2. Оператор typeid. ⇢
- Использование оператора typeid.
- Упражнения раздела 19.2.2.
- 19.2.3. Использование RTTI. ⇢
- Иерархия класса.
- Оператор равенства, чувствительный к типу.
- Виртуальная функция equal().
- Функция equal() базового класса.
- 19.2.4. Класс type_info. ⇢
- Упражнения раздела 19.2.4.
- 19.3. Перечисления. ⇢
- Перечислители.
- Подобно классам, перечисления определяют новые типы.
- Определение размера перечисления.
- Предварительные объявления для перечислений.
- Соответствие параметров и перечисления.
- 19.4. Указатель на член класса. ⇢
- 19.4.1. Указатели на переменные-члены. ⇢
- Использование указателей на переменные-члены.
- Функция, возвращающая указатель на переменную-член.
- Упражнения раздела 19.4.1.
- 19.4.2. Указатели на функции-члены. ⇢
- Использование указателя на функцию-член.
- Использование псевдонимов типов для указателей на члены.
- Таблицы указателей на функцию-член.
- Упражнения раздела 19.4.2.
- 19.4.3. Использование функций-членов как вызываемых объектов. ⇢
- Использование шаблона function для создания вызываемого объекта.
- Использование шаблона mem_fn для создания вызываемого объекта.
- Использование функции bind() для создания вызываемого объекта.
- Упражнения раздела 19.4.3.
- 19.5. Вложенные классы. ⇢
- Объявление вложенного класса.
- Определение вложенного класса вне содержащего класса.
- Определение членов вложенного класса.
- Определение статических членов вложенных классов.
- Поиск имен в области видимости вложенного класса.
- Вложенные и содержащие классы независимы.
- Упражнения раздела 19.5.
- 19.6. Класс объединения, экономящий место. ⇢
- Определение объединения.
- Использование объединения.
- Анонимные объединения.
- Объединения с членами типа класса.
- Использование класса для управления членами объединения.
- Управление дискриминанта и удаление строки.
- Управление членами объединения, требующее управления копированием.
- Упражнения раздела 19.6.
- 19.7. Локальные классы. ⇢
- Локальные классы не могут использовать переменные из области видимости функции.
- К локальным классам применимы обычные правила доступа.
- Поиск имен в локальном классе.
- Вложенные локальные классы.
- 19.8. Возможности, снижающие переносимость. ⇢
- 19.8.1. Битовые поля. ⇢
- Использование битовых полей.
- 19.8.2. Спецификатор volatile. ⇢
- Синтезируемые функции управления копированием не применимы к асинхронно-изменяемым объектам.
- 19.8.3. Директивы компоновки: extern "C". ⇢
- Объявление функций, написанных на языке, отличном от С++
- Директивы компоновки и заголовки.
- Указатели на функции, объявленные в директиве extern "С".
- Директивы компоновки применимы ко всем объявлениям.
- Экспорт функций, созданных на языке С++, в другой язык.
- Поддержка препроцессора при компоновке на языке С.
- Перегруженные функции и директивы компоновки.
- Упражнения раздела 19.8.3.
- Резюме. ⇢
- Термины. ⇢
- Приложения. ⇢
- Приложение A. Библиотека. ⇢
- А.1. Имена и заголовки стандартной библиотеки. ⇢
- А.2. Краткий обзор алгоритмов. ⇢
- А.2.1. Алгоритмы поиска объекта. ⇢
- Простой алгоритм поиска.
- Алгоритм поиска одного из нескольких значений.
- Алгоритм поиска последовательности.
- А.2.2. Другие алгоритмы, осуществляющие только чтение. ⇢
- А.2.3. Алгоритмы бинарного поиска. ⇢
- А.2.4. Алгоритмы записи в элементы контейнера. ⇢
- Алгоритмы, которые записывают, но не читают значения элементов.
- Алгоритмы записи с итераторами ввода.
- Алгоритмы записи с прямыми итераторами.
- Алгоритмы записи с двунаправленными итераторами.
- А.2.5. Алгоритмы сортировки и разделения. ⇢
- Алгоритмы разделения.
- Алгоритмы сортировки.
- А.2.6. Общие функции изменения порядка. ⇢
- Переупорядочивающие алгоритмы, использующие прямые итераторы.
- Переупорядочивающие алгоритмы, использующие двунаправленные итераторы.
- Переупорядочение алгоритмов с помощью итераторов прямого доступа.
- А.2.7. Алгоритмы перестановки. ⇢
- А.2.8. Алгоритмы набора для отсортированных последовательностей. ⇢
- А.2.9. Минимальные и максимальные значения. ⇢
- Лексикографическое сравнение.
- А.2.10. Числовые алгоритмы. ⇢
- A.3. Случайные числа. ⇢
- А.3.1. Распределение случайных чисел. ⇢
- Равномерное распределение.
- Распределение Бернулли.
- Распределение Пуассона.
- Нормальное распределение или распределение Гаусса.
- Выборочное распределение.
- А.3.2. Процессоры случайных чисел. ⇢
- Тип default_random_engine.
- Тип linear_congruential_engine.
- Тип mersenne_twister_engine.
- Тип subtract_with_carry_engine.
- Тип discard_block_engine.
- Тип independent_bits_engine.
- Тип shuffle_order_engine.
С. Б. Липпман, Ж. Лажойе, Б. Э. Му.