- •Оглавление
- •1. Спецификация const для данных. Назначение.
- •2. Спецификация inline для функций. Назначение.
- •4. Ссылки. Назначение, обращение к данным по ссылке, использование ссылок для параметров функции и возвращаемого значения.
- •5. Динамическое создание и уничтожение объектов. Можно ли операции new и delete использовать вместе с malloc и free?
- •6. Динамическое создание и уничтожение массивов объектов.
- •8. Использование операции :: для доступа к элементам класса и глобальным функциям и переменным
- •9. Спецификации const для методов, не изменяющих объект. Спецификация mutable для элементов данных.
- •10. Дружественные функции и классы.
- •11. Статические переменные класса. Определение и инициализация.
- •12. Статические методы класса.
- •13. Указатель this. Назначение.
- •14. Конструктор: назначение, объявление (синтаксис), момент выполнения.
- •15. Конструктор: инициализация базовых классов и данных объекта через список инициализации в конструкторе.
- •16. Конструктор по умолчанию: объявление (синтаксис), назначение.
- •17. Конструктор копий: объявление (синтаксис), назначение.
- •18. Деструктор: назначение, объявление (синтаксис), момент выполнения.
- •19. Констукторы-преобразователи и операции для преобразования, способ вызова. Спецификация explicit для конструкторов-преобразователей.
- •20. Шаблоны функций: определение (синтаксис), назначение. Как вызвать функцию-шаблон?
- •21. Шаблоны классов (параметризация): определение (синтаксис), назначение. Как создать объект шаблонного класса?
- •22. Специализация шаблонов.
- •23. Библиотека stl. Общая характеристика.
- •24. Перегрузка функций и методов, основные правила связывания.
- •25. Правила перегрузки операций
- •26. Формат перегрузки унарных и бинарных операций как методов и [дружественных] функций.
- •28. Перегрузка операций присваивания: назначение, объявление (синтаксис), действия выполняемые в методе.
- •29. Перегрузка операций [] и () : назначение, объявление (синтаксис).
- •31. Перегрузка операций new и delete в классе: назначение, объявление (синтаксис).
- •32. Исключительные ситуации: назначение и стандартные искл. Ситуации (кроме stl).
- •33. Исключительные ситуации: порождение и перехват (синтаксис).
- •34. Исключительные ситуации: спецификация порождаемых исключительных ситуаций в заголовке функции.
- •36. Чисто виртуальные функции и абстрактные классы.
- •37. Простое наследование: определение, синтаксис. Порядок выполнения конструкторов и деструкторов. Вызов методов, переопределенных в производном классе, из базового класса.
- •39. Операция typeid. Rtti.
- •40. Операция безопасного преобразования данных const_cast. Назначение, синтаксис вызова.
- •41. Операция безопасного преобразования данных static_cast. Назначение, синтаксис вызова.
- •42.Операция безопасного преобразования данных dynamic_cast. Назначение, синтаксис вызова.
- •43. Операция безопасного преобразования данных reinterpret_cast. Назначение, синтаксис вызова.
- •44. Пространства имен: назначение, определение (синтаксис), варианты использования имен из namespace в своей программе.
- •45. Какие методы должны быть определены в классе с динамическим выделением памяти для некоторых элементов данных?
- •46. Сложность программного обеспечения.
- •47. Пять свойств сложной системы.
- •48. Основные методы при создании сложных систем.
- •49. Основные положения оо подхода.
- •50. Концепции оо подхода: Абстрагирование.
- •51. Концепции оо подхода: Ограничение доступа.
- •52. Концепции оо подхода: Модульность
- •53. Концепции оо подхода: Иерархия.
- •54. Концепции оо подхода: Типизация.
- •55. Концепции оо подхода: Параллелизм.
- •56. Концепции оо подхода: Устойчивость (сохраняемость).
- •57. Объекты в ооп: Определение объекта.
- •58. Объекты в ооп: Состояние.
- •59. Объекты в ооп: Поведение. Операции.
- •60. Объекты в ооп: Уникальность (идентичность).
- •61. Объекты в ооп: Отношения между объектами.
- •62. Классы в ооп: Понятие класса, связь между объектами и классами.
- •63. Отношения между классами: Ассоциации.
- •64. Отношения между классами: Наследование.
- •65. Отношения между классами: Агрегация.
- •66. Отношения между классами: Использование.
- •67. Отношения между классами: Конкретизация (параметризованные классы).
- •68. Отношения между классами: Метаклассы.
- •69. Паттерны проектирования: Абстрактная фабрика.
- •70. Паттерны проектирования: Одиночка.
- •71. Паттерны проектирования: Прототип (виртуальный конструктор).
- •72. Паттерны проектирования: Адаптер.
- •73. Паттерны проектирования: Заместитель.
- •74. Паттерны проектирования: Компоновщик.
- •75. Паттерны проектирования: Декоратор.
- •76. Паттерны проектирования: Итератор.
- •77. Паттерны проектирования: Шаблонный метод.
51. Концепции оо подхода: Ограничение доступа.
Инкапсуляция (ограничение доступа) – это процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение; инкапсуляция служит для того, чтобы изолировать контрактные обязательства абстракции от их реализации.
Никакая часть сложной системы не должна зависеть от внутреннего устройства какой-либо другой части. Абстракция помогает создавать программы, а инкапсуляция упрощает их модификацию. Чаще всего инкапсуляция выполняется посредством скрытия информации, то есть маскировкой всех внутренних деталей, не влияющих на внешнее поведение. Обычно скрываются и внутренняя структура объекта, и реализация его методов.
Абстракция и инкапсуляция дополняют друг друга: абстрагирование направлено на наблюдаемое поведение объекта, а инкапсуляция занимается внутренним устройством. Практически это означает наличие двух частей в классе: интерфейса и реализации. Интерфейс отражает внешнее поведение объекта, описывая абстракцию поведения всех объектов данного класса. Внутренняя реализация описывает представление этой абстракции и механизмы достижения желаемого поведения объекта. Принцип разделения интерфейса и реализации соответствует сути вещей: в интерфейсной части собрано все, что касается взаимодействия данного объекта с любыми другими объектами; реализация скрывает от других объектов все детали, не имеющие отношения к процессу взаимодействия объектов.
Скрытие информации – понятие относительное: то, что спрятано на одном уровне абстракции, обнаруживается на другом уровне. "Инкапсуляция защищает от ошибок, но не от жульничества."
52. Концепции оо подхода: Модульность
Модульность – это свойство системы, которая была разложена на внутренне связные, но слабо связанные между собой модули.
Разделение программы на части (модули) до некоторой степени позволяет уменьшить ее сложность. Внутри модульной программы создаются множества хорошо определенных и документированных интерфейсов. Эти интерфейсы неоценимы для исчерпывающего понимания программы в целом. Классы и объекты составляют логическую структуру системы, они помещаются в модули, образующие физическую структуру системы. Выявление классов и объектов в проекте и организация модульной структуры – независимые действия, выполняемые итеративно. Модульность дополняет инкапсуляцию и абстрагирование.
В разных языках программирования модульность поддерживается по-разному. В Smalltalk модулей нет, а в Delphi модуль – это специальная языковая конструкция.
unit mymodule;
interface // интерфейс
function len(a,b:extended):extended;
implementation // реализация
uses math; // использование модуля math
function len(a,b:extended):extended;
begin
len:=sqrt(a*a+b*b);
end;
end.
В языке C++ модулями являются раздельно компилируемые файлы. Интерфейсная часть модуля помещается в заголовочный файл с расширением .h (может быть общим для нескольких модулей), а реализация помещается в файл с расширением .cpp. Заголовочный файл подключается к файлу с реализацией и в модули-клиенты с помощью директивы препроцессора #include. Такой подход строится исключительно на соглашении и не является строгим требованием самого языка. Пример программы, состоящей из двух модулей.
Файл module1.h:
struct point {
double x,y;
double len();
};
extern point p1;
Файл module1.cpp:
#include "module1.h"
#include <math.h>
double point::len()
{ return sqrt(x*x+y*y);
}
point p1;
Файл module2.cpp:
#include "module1.h"
...
int main()
{ point a=p1;
cout<<a.len()<<"\n";
...
}
Правильное разделение программы на модули является почти такой же сложной задачей, как выбор правильного набора абстракций. Поскольку в начале работы над проектом решения могут быть неясными, декомпозиция на модули может вызвать затруднения. Для хорошо известных приложений этот процесс можно стандартизовать, но для новых задач задача может быть очень трудной.
Для небольших задач допустимо описание всех классов и объектов в одном модуле. Однако для большинства программ лучшим решением будет сгруппировать в отдельный модуль логически связанные классы и объекты, оставив открытыми только те элементы, которые необходимо видеть другим модулям. Конечной целью декомпозиции программы на модули является снижение затрат на программирование за счет независимой разработки и тестирования. Структура модуля должна быть достаточно простой для восприятия; реализация каждого модуля не должна зависеть от реализации других модулей; должны быть приняты меры для облегчения процесса внесения изменений там, где они наиболее вероятны.
Если изменяется реализация, то заново компилируется только данный модуль, и программа перекомпонуется. Перекомпиляция интерфейсной части модуля, напротив, более трудоемка, так как приходится перекомпилировать все модули, связанные с данным, для очень больших программ могут потребоваться многие часы на перекомпиляцию. Поэтому следует стремиться к тому, чтобы интерфейсная часть модулей была возможно более узкой. Таким образом, программист должен находить баланс между двумя противоположными тенденциями: стремлением скрыть информацию и необходимостью обеспечения видимости тех или иных абстракций в нескольких модулях.
При коллективной разработке программ распределение работы осуществляется, как правило, по модульному принципу и правильное разделение проекта минимизирует связи между участниками. При этом более опытные программисты обычно отвечают за интерфейс модулей, а менее опытные – за реализацию. Документирование проекта также делается по модульному принципу – модуль служит единицей описания и администрирования.
