
Lektsia_Osnovy_OOP.pptx
- Количество слайдов: 35
Объектно-ориентированное программирование (ООП) Парадигма (принцип) программирования
Объектно-ориентированное программирование Парадигма программирования, основанная на представлении предметной области в виде взаимосвязанных абстрактных объектов и их реализаций
История создания ООП #include <stdio. h> int a[10]; int b[10]; void sort(int n ); void calc(int x[], int sz); int main(){ . . . . } void sort(int n ){ . . } void calc(int x[], int sz){ . . . } #include <stdio. h> struct Dot { int a, b; }; class Dot { public: int a, b; void sort(int n); void calc(int sz); }; Dot p[10]; void sort(int n); void calc(Dot x[], int sz); Dot p[10]; int main(){ . . . . } void sort(int n ){ . . } void calc(Dot x[], int sz){ . . . } void Dot: : sort(int n ){ . . } void Dot: : calc(int sz){ . . . }
Классы и объекты В ООП вводится понятие Класса – пользовательского типа данных, объединяющего данные и методы их обработки Объектом называется экземпляр класса Собака – это класс Собака Жучка из 3 подъезда – это объект, представитель или экземпляр класса «Собака»
Объявление класса в С++ class <Имя класса> { // поля класса (данные и методы) }; Создание экземпляра класса <Имя класса> <имя_переменной>;
Данные объекта (переменные объекта, члены-данные) Члены-данные (data members) хранят всю необходимую информацию об объекте, формируют его состояние, характеристики и т. п. Изменение состояния объекта или его характеристик связано с изменением данных, в нем содержащихся
Методы класса Класс может содержать один или более методов, позволяющих осуществлять манипуляцию данными объекта Метод объекта –программный код, выполненный в виде процедуры или функции Вызов метода объекта может приводить к изменению его состояния (значение членовданных), а может и не приводить Пример 1: поиск и замена текста в документе Пример 2: проверка правописания текста документа
Пример: Треугольник Поля Координаты вершины A Координаты вершины B Координаты вершины C Площадь Периметр Координаты центра вписанной окружности Методы Переместить в заданном направлении Отмасштабировать Повернуть вокруг заданной точки
class Point { public: double x, y; }; class Triangle { public: double Get. Area(); double Get. Perimeter(); Point Get. Center(); void Move(double dx, double dy); void Scale(double sx, double sy); void Rotate(Point center, double angle); Point p 0, p 1, p 2; };
Важнейшие принципы ООП Абстракция данных Инкапсуляция Наследование Полиморфизм
Абстракция данных Объекты представляют неполную информацию о реальных сущностях предметной области Абстракция позволяет оперировать с объектном на уровне, адекватном решаемой задаче Высокоуровневые обращения к объекту могут обрабатываться с помощью вызова функций и методов низкого уровня
Инкапсуляция - способность объекта скрывать внутреннее устройство своих свойств и методов Согласно данному принципу, класс должен рассматриваться как черный ящик Внешний пользователь не знает детали реализации объекта и работает с ним только путем предоставленного объектом интерфейса Следование данному принципу может уменьшить число связей между классами и упростить их независимую реализацию, модификацию и тестирование
Пример. Стек целых чисел class Int. Stack { public: void Push(int value); int Pop(); bool Is. Empty()const; private: // здесь располагаются данные // необходимые для реализации стека целых чисел }; int main ( ) { Int. Stask st; st. Push(5); st. Push(3); st. Pop(); return 0; }
Наследование позволяет описать новый класс на основе уже существующего родительского (базового) класса Класс-потомок может добавить свои собственные свойства и методы, пользоваться методами и свойствами базового класса Наследование позволяет строить иерархии классов
Пример class Plane { public: void Take. Off(); void Fly(); void Land(); private: double m_fuel; }; class Military. Plane : public Plane { public: void Attack(); private: int m_ammo; };
Полиморфизм Полиморфизмом называют явление, при котором классы-потомки могут изменять реализацию метода класса-предка, сохраняя его интерфейс (прототип вызова метода). Полиморфизм позволяет обрабатывать объекты классов-потомков как однотипные объекты, не смотря на то, что реализация методов у них может различаться
class Shape { public: virtual double Get. Area()=0; }; class Rectangle : public Shape { public: virtual double Get. Area() { return width * height; } private: double width, height; }; class Circle : public Shape { public: virtual double Get. Area() { return 3. 1415927 * radius; } private: double radius; };
Объявление класса в C++ Для объявления класса в C++ служит ключевое слово class Синтаксис class идентификатор { // объявление данных и методов }; Реализация методов класса может быть выполнена как внутри класса, так и вынесена за пределы объявления класса
Пример class Date { int year, month, day; void next(); void print(); }; // Реализация методов класса void Date: : print() { printf(“%d/%d/%d”, day, month, year); } void Date: : next() { //. . . }
Размещение классов в различных файлах Общепринятой практикой является размещение объявления классов в заголовочных файлах. h, а их реализации – в файлах. cpp Повышение модульности проекта Каждый класс может быть подключен для дальнейшего использования при помощи директивы #include “имя заголовочного файла” При внесении изменений в реализацию метода класса перекомпиляции подвергнутся только измененные файлы
Пример date. h class Date { public: void Next(); void Print(); private: int m_day; int m_month; int m_year; }; date. cpp main. cpp #include “date. h” void Date: : Next() { //. . . } int main() { Date date 1; return 0; } void Date: : Print() { //. . . }
Ограничение доступа к данным и методам класса Доступ к данным и методам класса извне может быть ограничен Рекомендуется запрещать доступ к данным класса в обход его методов Для разделения прав доступа к полям класса используются ключевые слова public: private: protected:
Публичные (public) поля класса Public-методы и данные класса определяют его интерфейс доступ к ним возможен из любой части кода необходимо помещать в public-раздел класса только необходимый набор методов, выполняющих высокоуровневые операции над объектом класса
Закрытые (частные) поля класса Private-данные и методы класса определяют его реализацию Доступ к ним разрешен только из методов данного класса Рекомендуется все данные класса делать закрытыми, их обработку осуществлять внутри методов Закрытые методы класса обычно используются публичными методами, решая внутренние задачи класса
Защищенные поля класса Protected-данные и методы определяют интерфейс для производных классов Доступ к ним разрешен изнутри методов данного класса и всех его потомков В защищенной зоне размещают методы, которые не должны быть видны снаружи класса, но реализация которых может быть переопределена или использована производными классами (потомками, наследниками)
Пример class Date { public: void Next(); void Print(); private: int year, month, day; }; // Реализация методов класса void Date: : Print() { printf(“%d/%d/%d”, day, month, year); } int main () { Date d; d. Next(); // можно d. Print(); // можно d. year = 3; // нельзя, закрытая зона return 0; }
Ссылка на себя Внутри методов класса для обращения к данным класса можно использовать их имена В метод класса неявно передается указатель на объект, для которого он вызывается Доступен данный указатель по ключевому слову this
Пример class Elem { public: int a; void set (int a) { a = a; // непонятно this. a = a; // понятно } ……. . }; class List. Item { public: void Append(List. Item *p. Item) { p. Item->m_p. Next = this; m_p. Previous = p. Item; m_p. Next = NULL; } private: List. Item *m_p. Next; List. Item *m_p. Previous; int m_data; };
Константные методы В языке C++ методы объекта, не изменяющие его состояния (данные, поля) могут быть объявлены константными Например, методы, возвращающие значения определенных полей данных Изменить данные класса из константного метода нельзя
Пример class Int. Array { public: … int Get. Size()const { return m_number. Of. Items; } void Clear. Elements() { delete [] m_p. Data; m_p. Data = NULL; m_number. Of. Items = 0; } private: int *m_p. Data; int m_number. Of. Items; }; void f(Int. Array const& array) { int i = array. Get. Size(); array. Clear. Elements(); } // можно // нельзя – неконстантные методы недоступны
Инициализация экземпляра класса Для инициализации состояния объекта в момент его создания существует специальная функция – конструктор Конструктор имеет то же имя, что и имя класса Тип возвращаемого значения для конструктора не указывается (даже void) Конструктор вызывается в момент создания экземпляра класса (объявление переменной класса или вызов оператора new) Класс может иметь несколько конструкторов, предоставляющих различные способы инициализации объекта
Конструктор по умолчанию Конструктор, не имеющий параметров, называется конструктором по умолчанию Поля данных в таком конструкторе инициализируются значениями по умолчанию Создавать такой конструктор или не создавать – зависит от конкретной задачи Пример: class Dot { public: int x, y ; Dot () { x = y = 1; } ……. };
Инициализация данных экземпляра класса В качестве данных класса могут выступать другие классы Их инициализация осуществляется ДО выполнения тела конструктора Для их инициализации вызываются конструкторы по умолчанию Если таковых не имеется, программист должен использовать списки инициализации
Деинициализация экземпляра класса В ходе своей работы объект может использовать определенные системные ресурсы Динамическая память, открытые файлы, сетевые соединения и т. п. Для освобождения этих ресурсов служит особый метод класса – деструктор Имя деструктора совпадает с именем класса, только перед ним указывается символ ~ (тильда) Данная функция вызывается автоматически при уничтожении экземпляра класса: Выход за пределы блока, в котором объявлен экземпляр класса Вызов оператора delete или delete []
Пример class My. File { public: My. File(){ m. File = NULL; } ~My. File() { if (m_p. File){ fclose(m. File); m. File = NULL; } } int Open(const char *file. Name) { m. File = fopen(file. Name, “r”); return (m. File != NULL); } private: FILE *m. File; };
Lektsia_Osnovy_OOP.pptx