- •Основы ооп. Понятие инкапсуляции, наследования и полиморфизма.
- •Класс в ооп и его основные компоненты.
- •Перегрузка функций.
- •Уровни доступа к элементам класса.
- •Область видимости объектов, скрытие имен.
- •Динамическая память, функции работы с памятью.
- •Динамическая память, операции работы с памятью.
- •Передача аргументов в функцию по умолчанию.
- •11. Характеристика элементов-данных класса.
- •13. Указатель «this». Пример явного использования.
- •Void load_i (int val) {
- •14. Функции-друзья класса.
- •15. Функции-конструкторы. Явный и косвенный вызов конструктора.
- •16. Функции-деструкторы.
- •17. Методы класса с атрибутом «const».
- •18. Статические методы и данные. Атрибут «static»
- •23. Виртуальный базовый класс.
- •25. Виртуальные функции. Переопределение виртуальных функций.
- •26. Понятие абстрактного класса.
- •27. Перегрузка операций.
- •28. Особенности перегрузки операций при помощи методов класса и функций-друзей.
- •29. Перегрузка методами класса.
- •30. Использование ссылок при перегрузке унарных операций.
- •31. Стандартная библиотека. Общая характеристика.
- •32. Строковый класс стандартной библиотеки.
- •2. String (const char *str);
- •3. String (const string &str);
- •Insert() - вставка символов одной строки в другую
- •33. Контейнерные классы.
- •Vector - динамический массив
- •34. Итераторы.
- •Категории итераторов
- •Операции доступные итераторам
- •35. Алгоритмы.
- •36. Потоковые классы.
- •37. Управление выводом. Манипуляторы и флажки.
- •38. Файловые потоки.
- •39. Шаблоны функций
- •40. Шаблоны классов.
- •41. Обработка исключений. Общая характеристика.
- •42. Вложенные классы.
- •43. Классы и указатели при наследовании.
- •44. Многократная перегрузка операций.
- •46. Указатель типа «void».
- •47. Адрес в качестве возвращаемого значения функции.
- •48. Операция «typeid».
- •49. Виды обработчиков исключительных операций.
- •50. Отличие вызова функций от вызова обработчика исключительной ситуации.
- •51. Создание собственного завершающего кода при перехвате исключительной ситуации.
- •52. Форма конструктора со списком инициализации.
49. Виды обработчиков исключительных операций.
Виды обработчиков м. быть следующими:
-с перехватом всех исключительных ситуаций.
-с ограничениями, налагаемыми на тип исключений, генерируемых функциями.
-с повторным генерированием исключения.
50. Отличие вызова функций от вызова обработчика исключительной ситуации.
Существенное отличие вызова конкретного обработчика от вызова обычной функции заключается в следующем: при возникновении исключения и передаче управления определенному обработчику система осуществляет вызов всех деструкторов для всех объектов классов, которые были созданы с момента начала контроля и до возникновения исключительной ситуации с целью их уничтожения.
51. Создание собственного завершающего кода при перехвате исключительной ситуации.
Собственный завершающего кода при перехвате исключительной ситуации создается в обработчике ситуации catch.
catch – сам обработчик исключения, который перехватывает информацию:
catch ( тип, параметр)
{
код
}
Через параметр обработчику передаются данные определенного типа, описывающие обрабатываемое исключение.
Код определяет те действия, которые надо выполнить при возникновении данной конкретной ситуации. В С++ используют несколько форм обработчиков. Такой обработчик получил название «параметризованный специализированный перехватчик».
Перехватчик должен следовать сразу же после блока контроля, т.е. между обработчиком и блоком контроля не должно быть ни одного оператора. При этом в одном блоке контроля можно вызывать исключения разных типов для разных ситуаций, поэтому обработчиков может быть несколько.
В этом случае их необходимо расположить сразу же за контролирующим блоком последовательно друг за другом.
Кроме того, запрещены переходы, как извне в обработчик, так и между обработчиками.
Можно воспользоваться универсальным или абсолютным обработчиком:
catch ()
{
код
},
где (...) означают способность данного перехватчика обрабатывать информацию любого типа. Такой обработчик располагают последним в пакете специализированных обработчиков. Тогда, если исключение не будет перехвачено специализированными обработчиками, то будет выполнен последний – универсальный.
52. Форма конструктора со списком инициализации.
Для инициализации переменных класса используются списки иницицализации. Вот как выглядит определение конструктора класса soldier со списком инициализации: soldier () : x(0), y(0), ammo(100) {} Список инициализации записывается после круглых скобок в заголовке конструктора и отделён двоеточием. В списке, через запятую указываются переменные класса, а в скобках пишется значение, которым должны быть проинициализированы переменные.
Правила
Основные правила перегрузки операций.
Вводить собственные обозначения для операций, не совпадающие со стандартными операциями языка С++, нельзя.
Не все операции языка С++ могут быть перегружены. Нельзя перегрузить следующие операции: . – прямой выбор компонента, .* – обращение к компоненту через указатель на него, ? : – условная операция, :: – операция указания области видимости, sizeof, # и ## – препроцессорные операции.
Каждая операция, заданная в языке, имеет определенное число операндов, свой приоритет и ассоциативность. Все эти правила, установленные для операций в языке, сохраняются и для ее перегрузки, т.е. изменить их нельзя.
Любая унарная операция @ определяется двумя способами: либо как компонентная функция без параметров, либо как глобальная (возможно дружественная) функция с одним параметром. Выражение @z означает в первом случае вызов z.operator @(), во втором - вызов operator @(z).
Любая бинарная операция @ определяется также двумя способами: либо как компонентная функция с одним параметром, либо как глобальная (возможно дружественная) функция с двумя параметрами. В первом случае x @ y означает вызов x.operator @(y), во втором – вызов operator @(x, y).
Перегруженная операция не может иметь аргументы (операнды), заданные по умолчанию.
В языке С++ установлена идентичность некоторых операций, например, ++z – это тоже, что и z += 1. Эта идентичность теряется для перегруженных операций.
Функцию operator можно вызвать по ее имени, например, z = operator * x, y) или z = x.operator *(y). В первом случае вызывается глобальная функция, во втором – компонентная функция класса X, и x – это объект класса X. Однако, чаще всего функция operator вызывается косвенно, например, z = x * y.
За исключением перегрузки операций new и delete функция operator должна быть либо нестатической компонентной функцией, либо иметь как минимум один аргумент (операнд) типа "класс" или "ссылка на класс" (если это глобальная функция).
Операции '=', '[]', '–>' можно перегружать только с помощью нестатической компонентной функции operator @. Это гарантирует, что первыми операндами будут леводопустимые выражения.
Операция '[]' рассматривается как бинарная. Пусть a – объект класса A, в котором перегружена операция '[]'. Тогда выражение a[i] интерпретируется как a.operator [](i).
Операция '()' вызова функции рассматривается как бинарная. Пусть a – объект класса A, в котором перегружена операция '()'. Тогда выражение a(x1, x2, x3, x4) интерпретируется как a.operator ()(x1, x2, x3, x4).
Операция '–>' доступа к компоненту класса через указатель на объект этого класса рассматривается как унарная. Пусть a – объект класса A, в котором перегружена операция '–>'. Тогда выражение a–>m интерпретируется как (a.operator–>())–>m. Это означает, что функция operator –>() должна возвращать указатель на класс A, или объект класса A, или ссылку на класс A.
Перегрузка операций '++' и '--', записываемых после операнда (z++, z--), отличается добавлением в функцию operator фиктивного параметра int, который используется только как признак отличия операций z++ и z-- от операций ++z и --z.
Глобальные операции new можно перегрузить и в общем случае они могут не иметь аргументов (операндов) типа "класс". В результате разрешается иметь несколько глобальных операций new, которые различаются путем изменения числа и (или) типов аргументов.
Глобальные операции delete не могут быть перегружены. Их можно перегрузить только по отношению к классу.
Заданные в самом языке глобальные операции new и delete можно изменить, т.е. заменить версию, заданную в языке по умолчанию, на свою версию.
Локальные функции operator new() и operator delete() являются статическими компонентами класса, в котором они определены, независимо от того, использовался или нет спецификатор static (это, в частности, означает, что они не могут быть виртуальными).
Для правильного освобождения динамической памяти под базовый и производный объекты следует использовать виртуальный деструктор.
Если для класса X операция "=" не была перегружена явно и x и y - это объекты класса X, то выражение x = y задает по умолчанию побайтовое копирование данных объекта y в данные объекта x.
Функция operator вида operator type() без возвращаемого значения, определенная в классе A, задает преобразование типа A к типу type.
За исключением операции присваивания '=' все операции, перегруженные в классе X, наследуются в любом производном классе Y.
Пусть X – базовый класс, Y – производный класс. Тогда локально перегруженная операция для класса X может быть далее повторно перегружена в классе Y.
|