- •1. Комментарии
- •2. Константы
- •3. Встраиваемые функции Встраиваемые функции
- •4. Объявление структур, объединений и перечислений
- •5. Объявление переменных
- •5. Ссылки Что такое ссылка и что с ней можно делать
- •Ссылку можно рассматривать как еще одно имя объекта. В основном ссылки используются для задания параметров и возвращаемых функциями значений, а также для перегрузки операций.
- •6. Использование спецификатора void
- •7. Преобразование стандартных типов данных.
- •8. Новые операции new, delete, операция расширения области видимости
- •1. Операция new
- •2. Операция delete
- •3. Операция :: области видимости
- •9. Объявление функций. Аргументы по умолчанию
- •10. Перегрузка функций
- •Когда использовать перегрузку
- •Новые возможности по сравнению с Си
- •Объектно-ориентированные особенности языка
- •Две роли классов
- •Поля класса
- •Конструкторы класса
- •13. Перегрузка операций
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •14. Дружественные функции
- •15. Сходства и различия классов, структур и объединений.
- •Отличия структур и объединений от классов
- •16. Классы и объекты. Определение класса и области видимости. Опережающее объявление класса
- •Две роли классов
- •Поля класса
- •17. Использование спецификатора класса памяти static. Статические компоненты класса
- •18. Константные объекты и константные методы
- •19. Неявный указатель this
- •20. Указатели на член класса
- •21. Локальные и вложенные классы
- •22. Специальный вид методов класса - конструкторы и деструкторы. Некоторые особенности конструкторов и деструкторов Конструкторы класса
- •23. Классы, содержащие объекты других классов
- •24. Создание объектов с различным временем жизни
- •25. Массивы объектов класса
- •26. Особенности копирования объектов Конструктор копирования
- •27. Заготовка класса без наследников
- •28. Пример вектора с неповерхностным копированием.
- •29. Излишнее копирование. Конструктор копии. Операции присваивания.
- •1. Излишнее копирование
- •2. Конструктор копирования
- •3. Операции присваивания
- •30. Преобразование типов. Стандартные преобразования. Явное преобразование типов
- •Преобразования указателей и ссылок
- •Явные преобразования типов
- •Неявное преобразование типа
- •31. Преобразования абстрактных типов данных (преобразование типов данных, созданных программистом)
- •32. Наследование классов
- •33. Доступ к наследуемым членам класса
- •34. Стандартные преобразования типов при наследовании
- •35. Инициализация объекта порожденного класса. Конструктор копии. Операция присваивания.
- •3. Операции присваивания
- •37. Виртуальные функции. Объявления виртуальных функций. Чисто виртуальные функции
- •Методы(функции)
- •38. Таблица виртуальных функций. Случаи, когда вызов виртуальной функции не будет виртуальным. Виртуальные деструкторы
- •39. Ввод-вывод файлов. Потоки ввода-вывода. Библиотека ввода-вывода (iostream). Группы классов библиотеки ввода вывода
- •40. Краткая характеристика иерархии классов производных от conbuf.
- •Класс conbuf (constrea.H)
- •Функции-элементы
- •41. Иерархия классов производных от ios
- •42. Состояния потока. Ошибки потоков. Состояние потока
- •С каждым потоком связан набор флагов, которые управляют форматированием потока. Они представляют собой битовые маски, которые определены в классе ios как данные перечисления. Манипуляторы
- •Шаблоны и наследование. Шаблоны и конфигурация компиляторов. Достоинства и недостатки шаблонов.
- •Совместное использование шаблонов и наследования
- •Достоинства и недостатки шаблонов
- •Исключения Применение try, catch, throw
- •47. Обработка исключительных ситуаций. Обработка завершения. Обработка структурных исключений, заявление исключения, фильтрующие выражение. Исключительные ситуации
- •Обработка исключительных ситуаций
- •Обработчик завершения
- •48. Стратегии взаимодействия объектов в программе. Программа как система взаимодействующих объектов. Система объектов, управляемых сообщениями
- •1. Программа, как система взаимодействия объектов.
- •49. Элементы объектно-ориентированного анализа и объектно-ориентированного проектирования. Диаграммы классов. Отношения классов: ассоциация, наследование, агрегация, использование.
- •51. Элементы объектно-ориентированного анализа и объектно-ориентированного проектирования. Диаграммы объектов, назначения, отношения между объектами. Диаграммы объектов (object diagrams)
С каждым потоком связан набор флагов, которые управляют форматированием потока. Они представляют собой битовые маски, которые определены в классе ios как данные перечисления. Манипуляторы
Несмотря
на гибкость и большие возможности
управления форматами с помощью
компонентных функций класса ios
, их применение достаточно громоздко.
Более простой способ изменения параметров
и флагов форматирования обеспечивают
манипуляторы.
Манипуляторами
называются специальные функции,
позволяющие модифицировать работу
потока. Особенность манипуляторов
состоит в том, что их можно использовать
в качестве правого операнда операции
>>
или <<
. В качестве левого операнда, как обычно,
используется поток (ссылка на поток), и
именно на этот поток воздействует
манипулятор. Манипуляторы указывают,
например, ширину поля, точность при
вычислении с плавающей точкой и т.п.
Для
обеспечения работы с манипуляторами в
классах istream
и ostream
имеются следующие перегруженные функции
operator
.
istream &operator >>(istream &(*_f)(istream &));
ostream &operator <<(ostream &(*_f)(ostream &));
При
использовании манипуляторов следует
включить заголовочный файл <iomanip.h>
,
в котором определены встроенные
манипуляторы. Манипуляторы действуют
на ввод-вывод в поток до внесения новых
изменений.
Флаги форматирования
|
Устанавливает 10-тичную систему счисления. Воздействует на int и long. |
|
Потоки используют основание 10 по умолчанию. |
|
Устанавливает 16-ричную систему счисления. |
|
Устанавливает 8-ричную систему счисления. |
|
Выбирает из потока ввода символы пропуска. Поток будет читаться |
|
до появления символа, отличного от пропуска, или до возникновения |
|
ошибки потока. |
|
Вставляет в поток вывода символ новой строки и затем сбрасывает поток. |
|
Вставляет |
|
Сбрасывает поток вывода. |
setbase()
устанавливает основание счисления к
любому из четырех значений:
0 |
Основание по умолчанию. При выводе 10-тичное, при вводе - числа, |
|
начинающиеся с |
|
- 16-ричными. Во всех остальных случаях основание считается 10-тичным. |
8 |
Для ввода-вывода используется основание 8. |
10 |
Для ввода-вывода используется основание 10. |
16 |
Для ввода-вывода используется основание 16. |
44. Шаблоны функций С++
Шаблоны, которые называют иногда родовыми или параметризоавнными типами, позволяют создавать (конструировать) семейства родственных функций и классов.
Цель введения шаблонов функций - автоматизация создания функций, которые могут обрабатывать разнотипные данные. В отличие от механизма перегрузки, когда для каждого набора формальных параметров определяется своя функция, шаблон семейства функций определяется один раз, но это определение параметризуется. Параметризовать в шаблоне функций можно тип возвращаемого функцией значения и типы любых параметров, количество и порядок размещения которых должны быть фиксированы. Для параметризации используется список параметров шаблона.
В определении шаблона семейства функций используется служебное слово template. Для параметризации используется список формальных параметров шаблона, который заключается в угловые скобки <>. Каждый формальный параметр шаблона обозначается служебным словом class, за которым следует имя параметра (идентификатор). Пример определения шаблона функций, вычисляющих абсолютные значения числовых величин разных типов:
template <class type>
type abs (type x) { return x > 0 ? x: -x;}
Шаблон семейства фукций состоит из двух частей - заголовка шаблона:
template <список_параметров_шаблона>
В качестве еще одного примера рассмотрим шаблон семейства функций для обмена значений двух передаваемых им параметров.
template <class T>
void swap (T* x, T* y)
{
T z = *x;
*x = *y;
*y = x;
}
Здесь параметр T шаблона функций используется не только в заголовке для спецификации формальных параметров, но и в теле определения функции, где он задает тип вспомогательной переменной z.
Шаблон семейства функций служит для автоматического формирования конкретных определений функций по тем вызовам, которые транслятор обнаруживает в теле программы. Например, если программист употребляет обращение abs(-10.3), то на основе приведенного ранее шаблона компилятор сформирует такое определение функции:
double abs (double x) {return x > 0 ? x: -x;}
Далее будет организовано выполнение именно этой функции и в точку вызова в качестве результата вернется числовое значение 10.3.
Если в программе присутствует приведенный ранее шаблон семейства функций swap()
long k = 4, d = 8, swap (&k, &d); то компилятор сформирует определение функции:
void swap (long* x, long* y)
{
long x = *x;
*x = *y;
*y = x;
}
Затем будет выполнено обращение именно к этой функции и значения переменных k, d поменяются местами.
Если в той же программе присутствуют операторы:
double a = 2.44, b = 66.3; swap (&a, &b); то сформируется и выполнится функция
void swap (double* x, double* y)
{
double x = *x;
*x = *y; *y = x;
}
По существу механизм шаблонов функций позволяет автоматизировать подготовку переопределений перегруженных функций. При использовании шаблонов уже нет необходимости готовить заранее все варианты функций с перегруженным именем. Компилятор автоматически, анализируя вызовы функций в тексте программы, формирует необходимые определения именно для таких типов параметров, которые использованы в обращениях. Дальнейшая обработка выполняется так же, как и для перегруженных функций
Параметры шаблонов.
Можно считать, что параметры шаблона являются его формальными параметрами, а типы тех параметров, которые используются в конкретных обращениях к функции, служат фактическими параметрами шаблона. Именно по ним выполняется параметрическая настройка и с учетом этих типов генерируется конкретный текст определения функции. Однако, говоря о шаблоне семейства функций, обычно употребляют термин <список параметров шаблона>, не добавляя определения <формальных>.
Перечислим основные свойства параметров шаблона:
Имена параметров шаблона должны быть уникальными во всем определении шаблона.
Список параметров шаблона функции не может быть пустым, так как при этом теряется возможность параметризации и шаблон функций становится обычным определением конкретной функции.
В списке параметров шаблона функций может быть несколько параметров. Каждый из них должен начинаться со служебного слова class. Например, допустим такой заголовок шаблона:
template <class type1, class type2>
Соответственно, неверен заголовок: template <class type1, type2, type3>
Недопустимо использовать в заголовке шаблона параметры с одинаковыми именами, то есть ошибочен такой заголовок: template <class t, class t, class t>
Имя параметра шаблона (в примерах - type1, type2) имеет в определяемой шаблоном функции все права имени типа, то есть с его помощью могут специализироваться формальные параметры, определяться тип возвращаемого функцией значения и типы любых объектов, локализованных в теле функции. Имя параметра шаблона видно во всем определении и скрывает другие использования того же идентификатора в области, глобальной по отношению к данному шаблону функций. Если внутри тела определяемой функции необходим доступ к внешним объектам с тем же именем, нужно применять операцию изменения области видимости.
45. Шаблоны классов С++. Определение шаблона класса. Явная реализация некоторых методов для специфических типов. Полное переопределение шаблона класса для работы с некоторым особым типом. Шаблоны и дружественные функции.