
- •Оценка алгоритма сортировки
- •Алгоритмы неустойчивой сортировки
- •Типы наследования Простое наследование
- •Множественное наследование
- •Алгоритм работы оператора присваивания
- •Перегрузка операции присваивания копированием
- •Нахождение кратчайших путей от заданной вершины до всех остальных вершин алгоритмом Дейкстры Постановка задачи
- •Алгоритм
- •Доказательство
- •Реализация
- •Метод Insert класса avlTree
- •Итераторы вывода
- •Виды исключительных ситуаций
- •2 Билет
- •Ограничения целостности
- •4.3.1.Целостность сущностей.
- •4.3.2.Целостность ссылок
- •3 Билет
Алгоритм работы оператора присваивания
Вычислить левостороннее значение первого операнда. На этом этапе становится известным местонахождение целевого объекта, приёмника нового значения.
Вычислить правостороннее значение второго операнда. Этот этап может быть сколь угодно большим и включать другие операторы (в том числе присвоения).
Присвоить вычисленное правостороннее значение левостороннему значению. Во-первых, при конфликте типов должно быть осуществлено их приведение(либо выдано сообщение об ошибке ввиду его невозможности). Во-вторых, собственно присваивания значения в современных языках программирования может быть подменено и включать не только перенос значений ячеек памяти (например, в «свойства» объектов в C#, перегрузка операторов).
Возвратить вычисленное правостороннее значение как результат выполнения операции. Требуется не во всех языках (например, не нужно в Паскале).
Операция присваивания в языке программирования C++ обозначается знаком '='. Как и другие операторы в C++, она может быть перегружена.
Операция присваивания копированием - особый вид операции присваивания, используемый для присваивания объектов одного класса друг другу. Является одним из особых членов-функций и генерируется автоматически компилятором в случае, если нет явного объявления программистом. Код, сгенерированный компилятором, выполняет поверхностное копирование.
Операция присваивания копированием отличается от конструктора копирования тем, что должен очищать члены-данные цели присваивания (и правильно обрабатывать самоприсваивание), тогда как конструктор копирования присваивает значения неинициализированным членам-данным.[1] Например:
My_Array first; // инициализация конструктором по умолчанию
My_Array second = first; // инициализация конструктором копирования
second = first; // присваивание операцией присваивания копированием
Перегрузка операции присваивания копированием
Когда нужно сделать глубокие копии объектов необходимо также принять во внимание и обработку исключений. Одним из способов избежать ошибки перемещения ресурсов является следующий:
Получаем новые ресурсы
Освобождаем старые ресурсы
Присваиваем объекту значения нового ресурса
class My_Array
{
int * array;
int count;
public:
My_Array & operator = (const My_Array & other)
{
if (this != &other) // защита от неправильного самоприсваивания
{
// 1: выделяем "новую" память и копируем элементы
int * new_array = new int[other.count];
std::copy(other.array, other.array + other.count, new_array);
// 2: освобождаем "старую" память
delete [] array;
// 3: присваиваем значения в "новой" памяти объекту
array = new_array;
count = other.count;
}
// по соглашению всегда возвращаем *this
return *this;
}
...
};
Основні елементі об’єктної моделі. Інкапсуляція, управління доступом до членів класу. Категорії методів класу. Приклад об’явлення класу.
Вообще говоря, под инкапсуляцией понимается доступность объекта исключительно посредством его свойств и методов.
Инкапсуля́ция — свойство языка программирования, позволяющее объединить данные и код в объект и скрыть реализацию объекта от пользователя (прикладного программиста). При этом пользователю предоставляется только спецификация (интерфейс) объекта. Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью директив: public, private, protected.
Свойства инкапсуляции:
• совместное хранение данных и функций;
• сокрытие внутренней информации от пользователя;
• изоляция пользователя от особенностей реализации.
class A
{
private:
int a,b; //скрытые свойства
void DoSomething(); //скрытый метод.
public:
int ReturnSomething(); //открытый интерфейс
};
Класс А инкапсулирует свойства a, b и метод DoSomething, представляя внешний интерфейс ReturnSomething.
Доступ к членам класса
Управление доступом применяется единообразно к функциям-членам класса и данным-членам класса.
Член класса может быть:
приватным (private) – это значит, что его имя может употребляться лишь внутри функций-членов класса и друзей класса, в котором этот член класса объявлен;
защищённым (protected) – это значит, что его имя может употребляться лишь внутри функций-членов класса, друзей этого класса ипроизводных от него классов;
публичным (public) – это значит, что его имя может употребляться внутри любой функции (а также и вне функций в инициализаторах).
Модификаторы доступа можно использовать несколько раз в одном и том же объявлении класса.
Механизмы управления доступом в С++ обеспечивают защиту от случайного, а не от преднамеренного доступа. Однако это относится к проблемам дисциплины программирования, а не к проблемам языка.
Члены класса без спецификатора доступа по умолчанию являются приватными. Члены структур и объединений по умолчанию являются публичными.
Различают простые методы и статические методы (методы класса):
простые методы имеют доступ к данным объекта (конкретного экземпляра данного класса),
статические методы не имеют доступа к данным объекта и для их использования не нужно создавать экземпляры (данного класса).
Методы предоставляют интерфейс, при помощи которого осуществляется доступ к данным объекта некоторого класса, тем самым, обеспечивая инкапсуляцию данных.
В зависимости от того, какой уровень доступа предоставляет тот или иной метод, выделяют:
открытый (public) интерфейс — общий интерфейс для всех пользователей данного класса;
защищённый (protected) интерфейс — внутренний интерфейс для всех наследников данного класса;
закрытый (private) интерфейс — интерфейс, доступный только изнутри данного класса.
Такое разделение интерфейсов позволяет сохранять неизменным открытый интерфейс, но изменять внутреннюю реализацию.
Определение (объявление) класса в языке C++ выглядит следующим образом:
class MyClass: public ParentClass // ParentClass — класс-предок, который должен быть определён ранее
{
public:
// элементы в этой секции доступны из любой части программы
MyClass(); // конструктор
~MyClass(); // деструктор
int classmember;
protected:
// элементы в этой секции доступны из класса и его потомков
private:
// элементы в этой секции доступны только из класса; это область доступа по умолчанию
};
Графи. Приклад реалізації находження найкоротшого шляху в графі на об’єктно-орієнтованій мові програмування.
Граф - это двойка <V, E>, где V - непустое множество вершин, а Е - множество ребер, соединяющих эти вершины попарно2). Две вершины, связанные между собой ребром, равноправны, и именно поэтому такиеграфы называются неориентированными: нет никакой разницы между "началом" и "концом" ребра.