- •1. Основные операции языка Си.
- •3. Язык Си: указатели и массивы. Определения, примеры.
- •4. Язык Си: объявления функций, передача аргументов. Примеры.
- •5. Язык Си: строки и указатели. Определения, примеры.
- •8. Язык Си: структуры. Пример.
- •9 . Язык Си: битовые поля и объединения. Примеры.
- •10. Язык Си: оператор определения типа. Примеры.
- •11.Язык Си: препроцессор. Директивы препроцессора, примеры
- •12.Язык Си: программный стек. Пример работы стека.
- •13. Линейные списки. Операции с линейными списками.
- •14 Hash-таблицы
- •15 Двоичные деревья
- •17. Язык Си: ссылочные типы. Пример.
- •18. Язык Си: защита указателей и объектов, неявное изменение объектов.
- •19. Язык Си: организация ввода/вывода. Пример: слияние файлов. Организация ввода/вывода
- •Открытие файла
- •Закрытие файла
- •Ввод из файла
- •Вывод в файл
- •Особые ситуации
- •Пример: слияние файлов
- •20. Язык Си: произвольный доступ к файлам. Пример.
- •22. Язык Си: примеры реализаций функций ввода/вывода (getc,putc).
- •23. Язык Си: примеры реализаций функций ввода/вывода (fgets, fputs).
- •24. Язык Си: работа с файловой системой. Пример.
- •25. Основные понятия ооп: абстракция, инкапсуляция, наследование, полиморфизм.
- •27. Объекты классов: статические,автоматические, динамические. Примеры.
- •28. Управление доступом к элементам классов. Пример.
- •29. Шаблоны функций и шаблоны классов. Примеры.
- •30. Наследование. Пример.
- •31. Множественное наследование. Пример.
- •П оскольку классы-потомки наследуют все данные и методы классов-предков, в итоге имеем следующую картину:
- •32. Виртуальные функции. Раннее и позднее связывание.
- •33. Абстрактные классы. Их назначение, пример.
- •34. Полиморфный контейнер (пример).
- •36. Конструкторы, их виды, примеры. Вызов конструкторов при наследовании.
- •37. Деструкторы. Их назначение, примеры.
- •39. Перегруженные операции. Примеры.
- •40. Обработка нештатных ситуаций. Объекты-исключения. Примеры.
- •Вопрос 1: какова дальнейшая судьба этих ресурсов, будут ли они освобождены?
- •Вопрос 2: как распознавать подобные ситуации и корректно их обрабатывать?
- •41. Модели жизненного цикла программного обеспечения. Модели жизненного цикла по
- •Спиральная модель жизненного цикла по.
- •42. Проектирование программного обеспечения и uml.
- •Uml (основные понятия)
- •Канонические диаграммы языка uml 2.X
- •43. Диаграммы прецедентов. Нотация, семантика, примеры.
- •Основные обозначения на диаграммах прецедентов:
- •44. Сценарии выполнения прецедентов (пример).
- •45. Диаграммы классов. Нотация, семантика, отношения.
- •46. Атрибуты на диаграммах классов. Нотация и семантика. Примеры.
- •47. Операции на диаграммах классов. Нотация и семантика. Примеры.
- •48. Отношения ассоциации на диаграммах классов.
- •Отношения ассоциации
- •Предприятие
- •Сотрудник
- •Отношения обобщения
- •Отношения композиции
- •53. Язык c#: сборки, манифесты, домены, компоненты.
- •55. Java как язык ооп для машинно-независимых приложений.
- •56. Обзор Java-технологий NetBeans ide.
- •57. Компонентные технологии разработки программного обеспечения.
- •59.Обёртки в языках c# и Java.
- •60. Архитектурный паттерн mvc. Область применения, схема взаимодействия.
37. Деструкторы. Их назначение, примеры.
Деструктором называетcя функция-член класса, которая всегда вызывается при завершении существования объектов класса. Назначение деструктора освободить полученные ресурсы, закрыть файлы, др. Имя деструктора должно начинаться со значка «~»(тильда) и в остальном совпадать с именем класса.
Деструкторы не имеют аргументов и не имеют возвращаемых значений. Деструкторы вызываются неявно и они не могут быть перегружены. Деструкторы могут быть виртуальными функциями. Деструкторы объектов вызываются в порядке обратном порядку вызова конструкторов объектов. Деструкторы глобальных объектов вызываются после завершения работы функции main ().
Class A1: {………. public: virtual ~A1 () ; } ; // класс А1
Class A2: public A1 {………. public: virtual ~A2 () ; } ; //класс А2
Class A3: public A2 {………. public: virtual ~A3 () ; } ; //класс А3
//создадим три объекта классов и посмотрим на работу их деструкторов
void main ( void ) {
A1 *p [3]; //массив указателей на объекты классов
p[0]=new A1; //создадим объект класса А1
p[1]=new A2; //создадим объект класса А2
p[2]=new A3; //создадим объект класса А3
delete p[1]; // порядок вызова деструкторов: ~A2(); ~A1();
delete p[2]; } ; // порядок вызова деструкторов: ~A3(); ~A2();~A1();
38. Перегруженные операции. Формализм на языке С++.
С++ позволяет переопределять большинство операций языка так, чтобы при использовании с объектами конкретных классов эти операции выполнялись специфически образом, через специально заданные функции.
Конкретно, можно перегружать следующие операции языка: + - * / % ^ & | ~ ! = += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- ->* , -> [] () new delete
Последние четыре операции означают: индексацию, вызов функции, размещение в динамической памяти и освобождение памяти.
Для дальнейшего изложения обозначим @ - некоторую перегружаемую операцию языка С++. Пусть х и у – объекты некоторых классов С++.
Перегрузка унарных операций.
@x – унарная операция над объектом х в префиксной форме интерпретируется как вызов функции-члена
x.operator@() без аргументов
или вызов friend-функции с именем
operator@(x) с одним аргументом.
x@ - унарная операция над объектом х в постфиксной форме интерпретируется как вызов функции члена
x.operator@(int) , где аргумент типа int – фиктивный
или вызова friend-функции с именем
operator@(x, int), где аргумент типа int – фиктивный.
Перегрузка бинарных операций.
x@y – бинарная операция с объектами х и у интерпретируется как вызов функции-члена
x.operator@(y) с одним аргументом
или вызов friend-функции с именем
operator@(x, y) с двумя аргументами.
Замечания к перегруженным операциям.
При перегрузке операций, полностью сохраняется синтаксис языка С++в том числе приоритет и порядок выполнения операций.
Можно перегрузить операции new и delete и начать самостоятельно управлять процессами выделения и освобождения динамической памяти.
Можно перегрузить операцию индексации []. Индексы могут иметь любой тип (например, цвет, текст, др.). Это есть ассоциативные массивы.
Итераторы в контейнерах можно заменить «умными» перегруженными операциями «++» и «--», которые при обходе не позволяют выйти за пределы контейнера.
Можно переопределить операцию косвенной адресации объекта «->» для работы с умными указателями, которые при каждом обращении к объекту будут выполнять любую заданную им работу.
Можно перегрузить операцию вызова функции, тогда запись вида <объект> ( <список-аргументов>) будет рассматриваться как бинарная операция operator() (…).
Можно перегрузить операцию преобразования типа (собственный кастинг).