- •Парадигмы программирования предпосылки появления, обзор существующих парадигм программирования.
- •3.2. Процедурная парадигма
- •3.2.1. История возникновения парадигмы
- •3.2.2. Языки, поддерживающие парадигму
- •3.2.3. Представление программ и реализация вычислений
- •Основные принципы объектно-ориентированной парадигмы.
- •Наследование и агрегация как реализации принципа иерархии в ооАиП.
- •Анализ и проектирование программного обеспечения: .Цели, классификация.
- •Структурный анализ программных систем: основные принципы, существующие методологии.
- •Диаграммы переходов состояний (std): назначение, нотация, примеры реализации.
- •Объектно-ориентированный анализ: базовые принципы, методология.
- •Язык uml: назначение, структура, нотация.
- •Сущности uml: типы, нотация, примеры описания.
- •Отношения uml: типы, нотация, примеры применения.
- •Диаграммы прецедентов uml: назначение, .Используемые элементы, примеры построения.
- •Диаграммы классов uml: назначение, используемые элементы, примеры построения.
- •Диаграммы взаимодействия uml: назначение, используемые элементы, примеры построения.
- •.Метрики качества структурного и объектно-ориентированного анализа и проектирования.
- •Понятие объекта и класса в объектно-ориентированном программировании. Члены-данные и члены функции.
- •2. Объект - как базовое понятие в объектно-ориентированном программировании
- •17.Конструкотр и деструктор.
- •18. Реализация принципа инкапсуляции ограничением области видимости компонент.
- •19. Аксессоры доступа к закрытым компонентам класса.
- •20. Статические компоненты класса: назначение, особенности и примеры использования.
- •Перегрузка стандартных операций: назначение, синтаксические особенности, примеры реализации.
- •Исключительные ситуации и способы их обработки. Блоки обработки и блоки завершения. Структурная обработка исключительных ситуаций.
- •Реализация принципа наследования в объектно-ориентированных языках программирования. Виды наследования.
- •Объявление наследования. Порядок определения новых и переопределения унаследованных компонент класса. Модификация области видимости компонент класса при наследовании.
- •Множественное наследование: объявление, примеры реализации, недостатки. Виртуальное наследование.
- •Виртуальные функции и полиморфизм – назначение, примеры практического использования.
- •Абстрактные классы: определение, назначение, примеры использования.
- •Интерфейс: назначение, синтаксис определения, примеры использования.
- •Основные принципы обобщенного программирования, его достоинства и недостатки.
- •Обобщение функций и методов: синтаксис определения, инстанцирование, особенности использования.
- •Обобщенные классы: синтаксис определения, примеры объявления и конкретизации.
- •Коллекции с#: реализация интерфейсов для сортировки элементов.
- •Делегаты c# как основной тип функторов.
- •Шаблоны проектирования: определение, классификация, назначение, достоинства и недостатки.
- •Шаблон Одиночка (Singleton): описание и пример программной реализации.
- •Шаблон Адаптер: назначение, структура, пример программной реализации.
- •Шаблон Наблюдатель (Observer): структура, пример реализации на языке c# с использованием событий (Events)
- •Архитектурный шаблон mvc: назначение, возможные структурные решения, примеры практической реализации
17.Конструкотр и деструктор.
Конструктор – это метод класса, имя которого совпадает с именем класса. Конструктор вызывается автоматически после выделения памяти для переменной и обеспечивает инициализацию компонент-данных. Конструктор не имеет никакого типа (даже типа void) и не возвращает никакого значения в результате своей работы. Конструктор нельзя вызывать как обычную компонентную функцию в программе. Конструктор не может быть объявлен виртуальным. Вызов конструктора в программе выглядит следующим образом:
имя_класса имя_объекта ( фактические_параметры_конструктора );
имя_класса * имя_указателя = new имя_класса(фактические_ параметры_ конструктора );
Для класса может быть объявлено несколько конструкторов, различающихся числом и типами параметров. При этом даже если для объектного типа не определено ни одного конструктора, компилятор создает для него конструктор по умолчанию, не использующий параметров, а также конструктор копирования, необходимый в том случае, если переменная объектного типа передается в конструктор как аргумент. В этом случае создаваемый объект будет точной копией аргумента конструктора.
//Листинг 6. Конструкторы по умолчанию
struct MyClass
{//конструкторы по умолчанию (создаются компилятором)
MyClass() // без параметров
{…}
MyClass(MyClass ©) //конструктор копирования
{…}
};
main()
{
MyClass m; //вызов конструктора без параметров
MyClass m1(m);//вызов конструктора копирования
}
Конструктор копирования используется для копирования объектов класса. Можно выделить следующие случаи вызова конструктора копирования:
а) при создании экземпляра класса на основе уже существующего объекта;
а) при передаче объекта класса в функцию по значению;
б) при возврате из функции как результата работы функции создается временный объект с использованием конструктора копирования.
Конструктор копирования по умолчанию копирует значения объектов поразрядно. Для класса array конструктор копирования должен создать свой динамический массив и поэлементно скопировать значения:
array(array ©) //конструктор копирования
{ n=copy.n
mas=new int[n];
for(int i=0;i<n;i++)
mas[i]=copy.mas[i];
}
Для класса array вместо метода InitMas необходимо определить конструктор, который выделял бы динамически память под массив.
//Листинг 7. Переопределение класса «массив целых чисел» с использованием
//конструктора
struct array
{ …
array(int k)
{if(k>0)
{ n=k;
mas=new int[n];
}
else
{cout<<Неверный размер массива”;
n=0;
}
}
…
};
main()
{ array m(5); //вызов конструктора. Память выделяется под 5 элементов массива
m.ReadMas(); //ввод элементов массива с клавиатуры
…
}
Описание конструктора можно упростить, если компонентные данные принадлежат к базовым типам или являются объектными переменными, имеющими конструктор. При описании конструктора после заголовка функции можно поставить двоеточие и за ним список инициализаторов вида
имя_компонента (выражение)
Например, для класса array можно было определить конструктор так:
class array
( .....
public:
array ( int k) : n(k)
{mas=new int[n] ;
}
};
Еще одним специальным методом класса является деструктор. Деструктор вызывается перед освобождением памяти, занимаемой объектной переменной, и предназначен для выполнения дополнительных действий, связанных с уничтожением объектной переменной, например, для освобождения динамической памяти, закрытия, уничтожения файлов и т.п.
Объявление деструктора в классе выглядит следующим образом:
~имя_класса() {тело деструктора}
Деструктор всегда имеет то же имя, что и имя класса, но перед именем записывается знак ~ (тильда). Деструктор не имеет параметров и подобно конструктору не возвращает никакого значения. Таким образом, деструктор не может быть перегружен и должен существовать в классе в единственном экземпляре. Деструктор вызывается автоматически при уничтожении объекта. Таким образом, для статически определенных объектов деструктор вызывается, когда заканчивается блок программы, в котором определен объект (блок в данном случае – составной оператор или тело функции). Для объектов, память для которых выделена динамически, деструктор вызывается при уничтожении объекта операцией delete.
//Листинг 8. Вызов деструктора объекта
main()
{
MyClass m; //создание объекта статически
MyClass *ptm=new MyClass; //создание объекта динамически
…
delete ptm; //вызов деструктора для динамического объекта
…
//вызов деструктора для статического объекта
}
Определим деструктор для класса array.
struct array
{ …
~array()
{ if(n>0)
delete []mas;
}
…
};
Деструктор в отличие от конструктора допускает явный вызов вида:
имя_обекта.~имя_класса()
адрес_объекта->~имя_класса()
