Слайд 2Классы и структуры в C++
Обеспечивают механизм создания собственных типов и определения различных
![Классы и структуры в C++ Обеспечивают механизм создания собственных типов и определения](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-1.jpg)
действий над ними.
Обычно используются для описания различных понятий, фигурирующих в решаемой задаче.
Акцентируют внимание разработчика на моделировании данных, а не действий.
Слайд 3Класс и объект
Класс — это сущность, которая задает общие свойства и общее
![Класс и объект Класс — это сущность, которая задает общие свойства и](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-2.jpg)
поведение для объектов (общий шаблон для создания объектов). По сути класс является типом данных.
Объект — это сущность в адресном пространстве вычислительной системы, которая появляется при создании экземпляра класса и обладает определенным состоянием, уникальностью и поведением.
Слайд 4Основные элементы объектной модели
Концептуальной базой объектно-ориентированного стиля программирования является объектная модель, основывающаяся
![Основные элементы объектной модели Концептуальной базой объектно-ориентированного стиля программирования является объектная модель,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-3.jpg)
на 4-х главных принципах:
Абстракция
Инкапсуляция
Модульность
Иерархия
Слайд 5Абстракция
Выделяет существенные характеристики некоторого объекта, отличающие его от других видов объектов.
Определяет концептуальные
![Абстракция Выделяет существенные характеристики некоторого объекта, отличающие его от других видов объектов.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-4.jpg)
границы объекта с точки зрения наблюдателя.
Слайд 6Инкапсуляция
Отделяет друг от друга элементы объекта, определяющие его устройство и поведения.
Изолирует внешний
![Инкапсуляция Отделяет друг от друга элементы объекта, определяющие его устройство и поведения.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-5.jpg)
интерфейс (то, что нам нужно знать для работы с объектом) от внутренней реализации.
Слайд 7Иерархия
Позволяет упорядочить абстракции, сформировать уровни абстрагирования, определить способы взаимодействия абстракций, их отношения.
![Иерархия Позволяет упорядочить абстракции, сформировать уровни абстрагирования, определить способы взаимодействия абстракций, их отношения.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-6.jpg)
Слайд 8Модульность
Позволяет описать систему как набор компонентов с сильными внутренними связями и более
![Модульность Позволяет описать систему как набор компонентов с сильными внутренними связями и](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-7.jpg)
слабыми внешними связями.
Уменьшает сложность системы.
Уровни модульности:
Файлы, каталоги…
Пространства имен, пакеты…
Слайд 9Класс: от требований к реализации
Определить свойства рассматриваемой сущности, важные для данной задачи
Определить
![Класс: от требований к реализации Определить свойства рассматриваемой сущности, важные для данной](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-8.jpg)
основные действия
Определить, какой набор данных достаточен для описания этих свойств
Определить список функций (методов), соответствующих требуемым действиям
Слайд 10Модель данных
class Rational
{ int numer; // Числитель
int denom; // Знаменатель (>=1)
public:
![Модель данных class Rational { int numer; // Числитель int denom; //](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-9.jpg)
Rational();
Rational(int n, int d);
int getNumer();
int getDenom(); };
Слайд 11Конструкторы
Конструктор — это метод класса который всегда вызывается при создании экземпляра класса
![Конструкторы Конструктор — это метод класса который всегда вызывается при создании экземпляра](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-10.jpg)
(объекта). Конструкторы предназначены для создания объектов класса, и для инициализации атрибутов объекта.
Имя конструктора всегда совпадает с именем класса.
Конструктор может принимать параметры, но никогда не возвращает значения.
Класс может содержать несколько конструкторов (перегрузка конструкторов).
Если в классе не объявлен конструктор, то компилятор предоставляет конструктор по умолчанию (стандартный конструктор).
Стандартный конструктор не принимает параметров и не выполняет никаких действий.
Слайд 12Конструкторы
Rational::Rational()
{ std::cout << "Call the default constructor" << std::endl;
numer = 0;
![Конструкторы Rational::Rational() { std::cout numer = 0; denom = 1; } Rational::Rational(int](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-11.jpg)
denom = 1; }
Rational::Rational(int n, int d)
{ std::cout << "Call constructor with parameters" << std::endl;
numer = n;
denom = d; }
Слайд 13Деструкторы
Деструктор — это метод класса который предназначен для уничтожения экземпляров класса, а
![Деструкторы Деструктор — это метод класса который предназначен для уничтожения экземпляров класса,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-12.jpg)
также для освобождения ресурсов используемых в объектах класса (например освобождение памяти).
Деструктор не принимает параметров и не может возвращать значение.
Класс может иметь только один деструктор.
Имя деструктора начинается символом «~»
Слайд 14Деструкторы
Деструкторы не могут перегружаться.
Деструкторы невозможно вызвать, они вызываются автоматически.
Если в классе не
![Деструкторы Деструкторы не могут перегружаться. Деструкторы невозможно вызвать, они вызываются автоматически. Если](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-13.jpg)
объявлен деструктор, то компилятор предоставит деструктор по умолчанию (стандартный деструктор). Стандартный деструктор не выполняет никаких действий.
Деструктор всегда вызывается при выходе объекта за пределы области видимости
Слайд 15Деструкторы
Rational::~Rational()
{ std::cout << "Call destructor" << std::endl; }
int main()
{ Rational r;
Rational
![Деструкторы Rational::~Rational() { std::cout int main() { Rational r; Rational r2(2, 3); }](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-14.jpg)
r2(2, 3); }
Слайд 16Уровни доступа к членам класса
Для поддержки принципа инкапсуляции, существуют три основных уровня
![Уровни доступа к членам класса Для поддержки принципа инкапсуляции, существуют три основных](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-15.jpg)
доступа к членам класса. Приведем их в порядке открытости для внешних абстракций:
Открытый(public) доступ – члены с этим уровнем доступа видимы всем клиентам класса.
Защищенный(protected) доступ – члены этого уровня видимы самому классу, его подклассам, и абстракциям.
Закрытый(private) доступ – члены этого уровня видимы только изнутри самого класса.
Слайд 17“public”-наследование
Если класс объявлен как базовый для другого класса со спецификатором доступа «public»:
«public»-члены
![“public”-наследование Если класс объявлен как базовый для другого класса со спецификатором доступа](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-16.jpg)
базового класса — доступны как «public»-члены производного класса;
«protected»-члены базового класса — доступны как «protected»-члены производного класса;
Слайд 18“private”-наследование
«public»- и «protected»- члены базового класса – доступны как «private»-члены производного класса.
![“private”-наследование «public»- и «protected»- члены базового класса – доступны как «private»-члены производного класса.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-17.jpg)
Слайд 19“protected”-наследование
«public» и «protected» - члены базового класса - доступны как «protected»-члены производного
![“protected”-наследование «public» и «protected» - члены базового класса - доступны как «protected»-члены производного класса;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-18.jpg)
класса;
Слайд 20Абстрактный класс
Абстрактный класс в ООП — базовый класс, который не предполагает создания
![Абстрактный класс Абстрактный класс в ООП — базовый класс, который не предполагает](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-19.jpg)
экземпляров. Абстрактный класс может содержать абстрактные методы и свойства. Абстрактный метод не реализуется для класса, в котором описан, однако должен быть реализован для его неабстрактных потомков. Абстрактные классы представляют собой наиболее общие абстракции, то есть имеющие наибольший объём и наименьшее содержание.
Слайд 21Ограничения на использование абстрактных классов
Абстрактные классы невозможно использовать для следующих элементов:
переменных
![Ограничения на использование абстрактных классов Абстрактные классы невозможно использовать для следующих элементов:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-20.jpg)
и данных членов;
типов аргументов;
типов возвращаемых функциями значений;
типов явных преобразований.
Слайд 22Виртуальные методы
Виртуальный метод (виртуальная функция) — в ООП метод (функция) класса, который
![Виртуальные методы Виртуальный метод (виртуальная функция) — в ООП метод (функция) класса,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-21.jpg)
может быть переопределён в классах-наследниках так, что конкретная реализация метода для вызова будет определяться во время исполнения.
Таким образом, программисту необязательно знать точный тип объекта для работы с ним через виртуальные методы: достаточно лишь знать, что объект принадлежит классу или наследнику класса, в котором метод объявлен.
Слайд 23Виртуальные методы
Виртуальные методы позволяют создавать общий код, который может работать как с
![Виртуальные методы Виртуальные методы позволяют создавать общий код, который может работать как](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-22.jpg)
объектами базового класса, так и с объектами любого его класса-наследника. При этом базовый класс определяет способ работы с объектами и любые его наследники могут предоставлять конкретную реализацию этого способа.
Слайд 24Виртуальный деструктор
Если деструктор объявлен как виртуальный, то при вызове его через указатель
![Виртуальный деструктор Если деструктор объявлен как виртуальный, то при вызове его через](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-23.jpg)
на объект базового класса (через delete) будет вызван вначале деструктор производного класса, а затем деструктор базового класса.
Слайд 25Приведение типов: const_cast
Снимает cv qualifiers — const и volatile, то есть константность
![Приведение типов: const_cast Снимает cv qualifiers — const и volatile, то есть](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-24.jpg)
и отказ от оптимизации компилятором переменной. Это преобразование проверяется на уровне компиляции и в случае ошибки приведения типов будет выдано сообщение.
Синтаксис:
TYPE const_cast (object);
Слайд 26Приведение типов: static_cast
Преобразует выражения одного статического типа в объекты и значения другого
![Приведение типов: static_cast Преобразует выражения одного статического типа в объекты и значения](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-25.jpg)
статического типа. Поддерживается преобразование численных типов, указателей и ссылок по иерархии наследования как вверх, так и вниз. Проверка производится на уровне компиляции, так что в случае ошибки сообщение будет получено в момент сборки приложения или библиотеки.
Слайд 27Приведение типов: dynamic_cast
Используется для динамического приведения типов во время выполнения. В случае
![Приведение типов: dynamic_cast Используется для динамического приведения типов во время выполнения. В](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1034042/slide-26.jpg)
неправильного приведения типов для ссылок вызывается исключительная ситуация std::bad_cast, а для указателей будет возвращен 0. Использует систему RTTI (Runtime Type Information). Безопасное приведение типов по иерархии наследования, в том числе для виртуального наследования.
Синтаксис:
TYPE& dynamic_cast (object);
TYPE* dynamic_cast (object);