- •Ооп. Абстракция, полиморфизм, наследование, инкапсуляция
- •Методы класса: классификация методов, доступ к членам класса, неявный параметр this. Определение и реализация методов. Использование методов для экземпляров класса.
- •Перегрузка функций: правила перегрузки, выбор функции. Использование перегруженных функций.
- •Перегрузка операторов: правила перегрузки, перегрузка бинарных и унарных операторов. Использование перегруженных операторов. Понятие объектов функций (функторов).
- •Перегрузка унарных операторов
- •Бинарные операторы
- •Преобразования типа: назначение, использование. Правила преобразования типа. Возможные проблемы.
- •Оператор присваивания
- •Типы отношений между классами. Контейнерные классы: определение, видимость членов класса. Реализация и вызов конструкторов и деструкторов вложенных классов. Реализация и использование методов.
- •Вложенные классы
- •12. Понятие и назначение итераторов. Проектирование, реализация и использование итератора (на примере динамического списка).
Ооп. Абстракция, полиморфизм, наследование, инкапсуляция
Объе́ктно-ориенти́рованное, или объектное, программи́рование (в дальнейшем ООП) —парадигма программирования, в которой основными концепциями являются понятия объектов и классов.
Инкапсуляция – это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя.
Например:
class A
{
public:
int a, b; //данные открытого интерфейса
int ReturnSomething(); //метод открытого интерфейса
private:
int Aa, Ab; //скрытые данные
void DoSomething(); //скрытый метод
};
PS. Надо указать также то, что при инкапсуляции, пользователь может взаимодействовать с открытыми(public) методами и данными, а с закрытыми(private) только через открытые методы.
Наследование – это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым или родительским. Новый класс – потомком, наследником или производным классом.
Например:
class A{ //базовый класс
};
class B : public A{ //public наследование (public -> public, protected -> protected)
};
class C : protected A{ //protected наследование (public, protected -> protected)
};
class Z : private A{ //private наследование (public, protected -> private)
};
Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. (переопределение, перегрузка и тд).
Абстрагирование – это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые. Соответственно,
абстракция – это набор всех таких характеристик.
Например:
Абстрактный класс – это базовый класс, объекты которого никогда не будут реализованы. Такой класс может существовать с единственной целью – быть родительским классом для классов, в которых объекты будут определены.
Class negative
{
Private:
int x;
Public:
Virtual void show() = 0;
};
PS В C++ абстрактные методы или чисто виртуальные функции получаются добавлением так называемого чистого описателя (=0) в определение метода. Абстрактные классы являются просто классами с одним или более абстрактным методом (или наследующие их). Вы не можете создать объект абстрактного класса.
2. Разработка класса в ООП: определение и реализация класса. Члены класса. Уровни видимости. inline-функции. Статические члены класса.
Класс – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт). С точки зрения программирования класс можно рассматривать как набор данных (полей, атрибутов, членов класса) и функций для работы с ними (методов). С точки зрения структуры программы, класс является сложным типом данных.
Вот C++ синтаксис определения простого класса:
class Date {
private: // скрытые данные(доступны внутри класса)
int dd; //объект(поле) класса
int mm;
int yy;
public: //открытые данные
void Init (int d, int m, int y); // метод класса
int Day ();
int Month ();
int Year ();
};
А вот определение одного из методов:
void Date::Init (int d, int m, int y)
{
dd = d;
mm = m;
yy = y;
}
Реализация:
Int main()
{
Date asd;
asd.init(1, 2, 3);
…
return 0;
}
Подставляемые (inline) функции
Подставляемые функции не вызываются как обычные функции языка C++. В машинный код программы вставляется код, соответствующий этой функции. Это как бы параметризированная макроподстановка, но уже на процессе компиляции.
Чаще всего, инлайн-функции определяются внутри класса(так они по принципу инлайн)
ОО языки обычно разрешают заводить методы и данные, относящиеся к классу целиком, а не к отдельным объектам. Метод класса обычно может быть вызван как для объекта класса, так и применён к классу в целом. Данные класса не повторяются для каждого объекта, а разделяются между всеми объектами данного типа. В C++ методы и данные класса отмечаются ключевым словом static. Данные класса должны быть проинициализированы специальным объявлением, ещё одной уступкой отсутствию модулей.
Конструкторы и деструктор: назначение и типы конструкторов; определение и реализация конструкторов; параметры по умолчанию. Использование конструкторов при различных способах создания экземпляров класса. Назначение и использование деструктора. Определение и реализация деструктора.
конструктор класса — специальный блок инструкций, вызываемый при создании объекта. Их задача — инициализировать члены объекта и определить инвариант класса, сообщив в случае некорректности инварианта. Корректно написанный конструктор оставит объект в «правильном» состоянии.
конструктор по умолчанию — конструктор, не принимающий аргументов;
конструктор копирования — конструктор, принимающий в качестве аргумента объект того же класса (или ссылку из него);
конструктор преобразования — конструктор, принимающий один аргумент (эти конструкторы могут вызываться автоматически для преобразования значений других типов в объекты данного класса).
class Complex
{
public:
// Конструктор по умолчанию
Complex():re(0), im(0) {}
// конструктором преобразования
Complex(double i_re = 0, double i_im = 0) : re(i_re), im(i_im) {}
// Конструктор копирования
Complex(const Complex &obj)
{
re = obj.re;
im = obj.im;
}
private:
double re, im;
};
Деструктор играет роль противоположную конструктору и обычно вызывается при уничтожении объекта. Если конструктор нужен большинству классов, то только некоторые из них нуждаются в деструкторе. Деструктор в основном используется для освобождения ресурсов, зарезервированных конструктором (или другими методами во время жизни объекта). Эти ресурсы включают память, файлы, базы данных, ресурсы ОС и т. д.
C++: деструкторы вызываются автоматически, когда объект выходит из области определения или когда вы удаляете объект, заведенный динамически. У каждого класса есть только один деструктор, который объявляется как ~Class(), где Class - имя класса. Если объект создан в куче, то он не может быть автоматически удален и если не объявить деструктор явно в программе, то происходит утечка памяти