- •Вопрос 1. Ссылки и ссылочные параметры.
- •Вопрос 2. Перегрузка функций.
- •Вопрос 3. Шаблоны функций.
- •Вопрос 4. Использование const с указателями.
- •Вопрос 5. Область действия класса. Управление доступом к членам класса. Отделение интерфейса от реализации.
- •Вопрос 6. Понятие конструктора .Использование констр-ра с аргументами по умолчанию. Конструктор по умолчанию.
- •Вопрос 7. Понятие деструктора. Когда вызывается конструктор и деструктор.
- •Вопрос 8. Константные объекты и функции-члены.
- •Вопрос 9. Дружественные функции и друж. Классы.
- •Вопрос 10. Указатель this.
- •Вопрос 11. Операции new и delete.
- •Вопрос 12. Статические члены класса.
- •Вопрос 13. Понятие перегрузки операций.
- •Вопрос 14. Функции-операции как члены класса и как друж-е функции
- •Вопрос 15. Перегрузка операций ввода/вывода в поток, бинар и унар операций.
- •Вопрос 17. Перегрузка операций индексации массива.
- •Вопрос 18. Понятие наследования. Механизм ограничения доступа при наследовании.
- •Вопрос 19. Приведение типа указателя базового класса к указателю производного класса и наоборот.
- •Вопрос 21. Конструкторы и деструкторы в производных классах.
- •Вопрос 22. Неявное преобразование объектов производных классов в объекты базового класса.
- •Вопрос 23. Иерархия классов. Уровни наследования.
- •Вопрос 24. Множественное наследование.
- •Вопрос 25. Неопределённость при множ-м наследовании. Включение «классы в классах».
- •Вопрос 26. Понятие виртуальной функции.
- •Вопрос 27. Понятие полиморфизма.
- •Вопрос 28. Абстрактные и конкретные базовые классы.
- •Вопрос 29. Статическое и динамическое связывание.
- •Вопрос 30. Виртуальные деструкторы.
- •Вопрос 31. Шаблоны классов.
- •Вопрос 32. Шаблоны классов и пользовательские типы
- •Вопрос 33. Шаблоны и наследование.
- •Вопрос 34. Классы и объекты потоков ввода/вывода. Иерархия потоковых классов.
- •Вопрос 35, 38. Предопределённые потоковые объекты. Состояние ошибок потока.
- •Вопрос 36. Манипуляторы потоков.
- •Вопрос 37. Неформатированный ввод/вывод с помощью read/ write
- •Вопрос 38. Состояние ошибок ввода/вывода
- •Вопрос 39. Понятие исключения. Когда должна использоваться обработка исключений.
- •Вопрос 40. Генерация исключений. Повторная генерация исключений.
- •Вопрос 41. Перехват исключений.
- •Вопрос 42. Спецификация исключений. Обработка неожиданных исключений.
- •Вопрос 43. «Раскручивание» стека. Иерархия исключений стандартной библиотеки.
- •Вопрос 44. Конструкторы, деструкторы и исключения. Исключения и наследование.
- •Вопрос 45. Обработка неуспешного выполнения new.
- •Вопрос 46. Класс auto_ptr и динамич выделение памяти.
- •Вопрос 47. Static_cast, reinterpret_cast
- •Вопрос 48. Инфо о типе времени выполнения. Оператор dynamic_cast
- •Вопрос 49. Ключевое слово explicit.
- •Вопрос 50. Ключевое слово mutable.
- •Вопрос 51. Указатели на члены класса.
- •Вопрос 52. Множественное наследование. Виртуальные базовые классы.
- •Вопрос 53. Классы-контейнеры и классы-итераторы.
- •Вопрос 54. Понятие ооп. Три условия ооп-программы. Парадигмы ооп.
- •Вопрос 55.Основные составляющие объектного подхода: абстрагирование, инкапсуляция, модульность.
- •Вопрос 56. Основные составляющие объектного подхода: иерархия, типизация, полиморфизм.
- •Вопрос 57. Природа объекта. Состояние, поведение, идентичность объекта.
- •Вопрос 58. Отношения между объектами. Связи. Агрегация.
- •Вопрос 59. Природа классов. Отношения между классами. Типы отношений.
Вопрос 3. Шаблоны функций.
Перегруженные ф-ции обычно используются для выполнения сходных операций над различными типами данных. Если операции идентичны для каждого типа, это можно выполнить более компактно и удобно, используя шаблоны ф-ций. Пишется единственное определение шаблона ф-ции. Основываясь на типах аргументов, указанных в вызовах этой функции, С++ автоматически генерирует разные функции для соответствующей обработки каждого типа. Таким образом, определение единственного шаблона определяет целое семейство решений.
Все определения шаблона ф-ции начинаются с ключевого слова template, за к-ым следует список формальных типов параметров ф-ции, заключенный в угловые скобки (< и >). Каждый формальный тип параметра предваряется ключевым словом class. Формальные типы параметров — это встроенные типы или типы, определяемые пользователем. Они используются для задания типов аргументов ф-ции, для задания типов возвращаемого значения ф-ции и для объявления переменных внутри тела описания ф-ции. После шаблона следует обычное описание ф-ции. Синтаксис шаблона должен повторяться как при объявлении, так и при определении функции. Можно определить неск-ко типов-шаблонов данных в инструкции template:
template <class T>
Т maximum(T valuel, Т value2, Т value3)
{ Т max = valuel;
if (value2 > max) max = value2;
if (value3 > max} max = value3;
return max; }
Этот шаблон ф-ции объявляет единственный формальный параметр Т как тип данных, к-ый должен проверяться ф-цией maximum. Когда компилятор обнаруживает вызов maximum в исходном коде программы, этот тип данных, переданных в maximum, подставляется вместо Т всюду в определении шаблона и С++ создает законченную ф-цию для определения мах-го из трех значений указанного типа данных. Затем заново созданная ф-ция компилируется. Т.о. шаблоны в действительности играют роль средств генерации кода. В программе обрабатываются три ф-ции — одна ожидает три значения int, вторая ожидает три значения double и третья ожидает три значения char.
Ограничения:
- выполнение разл. действий невозможно
- нельзя сделать виртуальную ф-ю шаблоном
Передача параметра
<Туре> следует указывать везде, кроме трех мест в объявлениях классов или определениях их функций:
1. За ключевым словом class в самом начале.
2. При указании имени конструктора.
3. При указании имени деструктора.
Аргументы конструкторов и деструкторов д. б. параметризованными, как и все использования имени класса за исключением трех указанных случаев. При любом использовании параметризованного типа или ф-ии необходимо указывать параметр.
Вопрос 4. Использование const с указателями.
Если переменная объявлена с ключевым словом const, значит, она не должна меняться. После определения константной переменной уже нельзя изменить ее значение или передать ее в ка-ве аргумента ф-ции, к-ая не гарантирует ее неизменности.
В операциях с указателями используются два объекта: сам указатель и объект, на к-ый он ссылается. Помещение ключевого слова const перед объявлением указателя делает константой объект, а не указатель. Для объявления самого указателя в кач-ве константы используется оператор объявления *const, а не просто *.
Существует шесть возможностей использования (или не использования) const с параметрами ф-ции — две с передачей параметров по значению и четыре с передачей параметров по ссылке.
Существуют четыре способа передачи в функцию указателя: неконстантный указатель на неконстантные данные, неконстантный указатель на константные данные, константный указатель на неконстантные данные и константный указатель на константные данные.
Наивысший уровень доступа предоставляется неконстантным указателем на неконстантные данные. Объявление неконстантного указателя на неконстантные данные не содержит const.
Неконстантный указатель на константные данные — это указатель, к-ый можно модифицировать, чтобы указывать на любые элементы данных подходящего типа, но данные, на к-ые он ссылается, не могут быть модифицированы. Такой указатель можно было бы использовать, чтобы передать аргументы массива ф-ции, к-ая будет обрабатывать каждый Эл-т массива без модификации данных.
const int* p;
int i = 17;
p = &i;
Константный указатель на неконстантные данные — это указатель, к-ый всегда указывает на одну и ту же ячейку памяти, данные в к-ой можно модифицировать посредством указателя. Этот вариант реализуется по умолчанию для имени массива. Имя массива — это константный указатель на начало массива. Используя имя массива и индексы массива можно обращаться ко всем данным в массиве и изменять их.
int i = 17;
int* const p1 = &i;
*p1 = 29; //величина, на к-ую ссылается указатель, может изменяться
Наименьший уровень привилегий доступа предоставляет константный указатель на константные данные. Такой указатель всегда указывает на одну и ту же ячейку памяти и данные в этой ячейке нельзя модифицировать (если массив нужно передать ф-ции, к-ая только просматривает массив, использует его индексы, но не модифицирует сам массив).
int i = 17;
int j = 29;
const int* const p1 = &i; // Можно
*p1 = 29; // Нельзя
p1 = &j; // Нельзя