c++ Базовый. Занятие 08

36
Модуль 3 : Основные понятия объектно-ориентированного программирования. Темы лекции : Введение в объектно-ориентированное программирование. Практическое задание : Введение в ООП. Тренер: Игорь Шкулипа, к.т.н. C++ Базовый. Занятие 8

Upload: igor-shkulipa

Post on 06-Apr-2017

81 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: C++ Базовый. Занятие 08

Модуль 3: Основные понятия объектно-ориентированного программирования.

Темы лекции: Введение в объектно-ориентированное программирование.

Практическое задание: Введение в ООП.

Тренер: Игорь Шкулипа, к.т.н.

C++ Базовый. Занятие 8

Page 2: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 2

Объектно-ориентированное программирование

ООП – это парадигма программирования, основанная напредставлении предметной области в виде взаимосвязанныхабстрактных объектов и их реализаций.

В ООП вводится понятие Класса – пользовательского типаданных, объединяющего данные и методы их обработки.

Объектом называется экземпляр класса.

Автомобиль– это класс (тип данных)

Автомобиль Bentley Continental GT черного цвета – это объект,или экземпляр класса «Автомобиль»

Page 3: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 3

Члены и методы класса

Члены-данные (поля) (data members) хранят всюнеобходимую информацию об объекте, формируют егосостояние, характеристики и т.п.

Изменение состояния объекта или его характеристик связано сизменением данных, которые в нем содержатся.

Метод объекта (methods) – программный код, выполненный ввиде функции, реагирующий на передачу объектуопределенного сообщения.

Вызов метода объекта может приводить к изменению егосостояния (значение членов-данных), а может и не приводить

Класс может содержать один или более методов, позволяющихосуществлять манипуляцию данными объекта

Page 4: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 4

Свойства

Свойство – составляющая часть объекта, доступ к которойосуществляется как к члену объекта, но таковым не является(реализуют принцип инкапсуляции для членов объекта).

В некоторых объектно-ориентированных языкахпрограммирования (например, в C++) свойства, как элементязыка, отсутствуют.

В этом случае в класс добавляют методы, посредством которыхосуществляется доступ к необходимым переменным класса.

Page 5: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 5

Пример: Класс «Треугольник»

Поля

◦ Координаты вершины A

◦ Координаты вершины B

◦ Координаты вершины C

◦ Площадь

◦ Периметр

Методы

◦ Нарисовать

◦ Переместить

◦ Масштабировать

◦ Повернуть

Page 6: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 6

Объявление класса в C++

Для объявления класса в C++ служит ключевое слово class.

class <Имя класса>

{

// объявление полей и методов

};

Реализация методов класса может быть вынесена за пределы объявления класса.

Page 7: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 7

Принципы ООП

● Абстракция данных

● Инкапсуляция

● Наследование

● Полиморфизм

Page 8: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 8

Абстракция данных

Объекты представляют неполную информацию о реальныхсущностях предметной области.

Абстракция позволяет оперировать с объектном на уровне,адекватном решаемой задаче.

Высокоуровневые обращения к объекту могут обрабатываться спомощью вызова функций и методов низкого уровня.

В основе реализации этого принципа лежит использованиеабстрактных классов интерфейсов.

Page 9: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 9

Инкапсуляция

Инкапсуляция – объединение в одной оболочке данных иметодов их обработки, а так же способность объекта скрыватьвнутреннее устройство своих полей и методов.

Согласно данному принципу, класс должен рассматриваться какчерный ящик.

Внешний пользователь не знает детали реализации объекта иработает с ним только путем предоставленного объектоминтерфейса (или открытых методов доступа).

Следование данному принципу может уменьшить число связеймежду классами и упростить их независимую реализацию,модификацию и тестирование.

Page 10: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 10

Пример: Стек

struct ListNode

{

double value;

ListNode* Next;

};

class Stack

{

public:

void Push(double value);

double Pop();

private:

// здесь располагаются данные

// необходимые для реализации стека

ListNode* _stack;

};

Page 11: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 11

Наследование

Наследование позволяет описать новый класс на основеуже существующего родительского (базового) класса.

Класс-потомок может добавить свои собственные свойства иметоды, а так же пользоваться методами и свойствамибазового класса.

Наследование позволяет строить иерархии классов.

Page 12: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 12

Пример

class List

{

public:

void AddElement(double value);

void RemoveElement(double value);

private:

ListNode* _list;

};

class Stack: public List

{

public:

void Push(double value);

double Pop();

private:

void AddElement(double value);

void RemoveElement(double value);

};

Page 13: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 13

Полиморфизм

Полиморфизмом называют явление, при котором классы-потомки могут изменять реализацию метода класса-предка,сохраняя его интерфейс.

Полиморфизм позволяет обрабатывать объекты классов-потомков как однотипные объекты, не смотря на то, чтореализация методов у них может различаться.

Page 14: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 14

Пример

class Figure

{

public:

virtual double GetArea(){return 0;};

};

class Rectangle : public Figure

{

public:

virtual double GetArea(){return _width * _height;}

private:

double _width, _height;

};

class Circle : public Figure

{

public:

virtual double GetArea(){return 3.1415927 * radius * radius;}

private:

double radius;

};

Page 15: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 15

Размещение классов в файлах

Общепринятой практикой является размещение объявленияклассов в заголовочных файлах .h, а их реализации – вфайлах .cpp

⚫Повышение модульности проекта.

⚫Каждый класс может быть подключен для дальнейшегоиспользования при помощи директивы #include.

⚫При внесении изменений в реализацию метода классаперекомпиляции подвергнутся только измененные файлы.

Page 16: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 16

Доступ к данным и методам класса

Доступ к данным и методам класса извне может быть ограничен

Рекомендуется запрещать доступ к данным класса в обход его методов

Для разделения прав доступа к полям класса используются ключевые слова

public

private

protected

Page 17: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 17

Открытые (public) поля и методы класса

Public-методы и данные класса определяют его интерфейс

доступ к ним возможен из любой части кода

Необходимо помещать в public-раздел класса тольконеобходимый набор методов, выполняющих высокоуровневыеоперации над объектом класса

Page 18: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 18

Закрытые (private) поля и методы класса

Private-данные и методы класса определяют его реализацию

Доступ к ним разрешен только из методов данного класса

Рекомендуется все данные класса делать закрытыми, ихобработку осуществлять внутри методов.

Закрытые методы класса обычно используются публичнымиметодами, решая внутренние задачи класса.

Page 19: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 19

Защищенные (protected) поля и методы класса

Protected-данные и методы определяют интерфейс дляпроизводных классов.

Доступ к ним разрешен внутри методов данного класса ивсех его потомков.

В защищенной зоне размещают методы, которые не должны бытьвидны снаружи класса, но реализация которых может бытьпереопределена или использована производными классами.

Page 20: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 20

Пример

class List

{

public:

void AddElement(double value);

void RemoveElement(double value);

protected:

ListNode* _list;;

};

class Stack: public List

{

public:

void Push(double value);

double Pop();

private:

void AddElement(double value);

void RemoveElement(double value);

};

Page 21: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 21

Указатель на себя

Внутри методов класса для обращения к данным класса можноиспользовать их имена.

В метод класса неявно передается указатель на объект, длякоторого он вызывается (ключевое слово this).

class Complex

{

private:

double re;

double im;

public:

void SetNumber(double re, double im)

{

this->re=re;

this->im=im;

}

}

Page 22: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 22

Константные методыМетоды объекта, не изменяющие его состояния (его данных) могут быть объявлены

константными.

Например, методы, возвращающие значения определенных полей данных.

Константные методы не могут изменить данные класса.

class Array

{

public:

int GetSize()const

{

return _size;

}

void ClearElements();

void AddElement(double);

private:

double* _data;

int _size;

};

Необходимость в константных методах возникает, если объект был объявлен какконстанта, либо доступен по константной ссылке или указателю на const.

В таком случае вызвать у него можно только константные методы.

Page 23: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 23

Изменчивые (mutable) данные класса

Данные класса, которые все-таки нужно изменять изконстантных методов класса объявляются с ключевым словомmutable

Пользоваться этой возможностью следует аккуратно (не нарушаяинкапсуляции). Даже в этом случае константные методы недолжны изменять состояние объекта (информацию о нем,доступную посредством публичных методов)

mutable bool _bChecked;

mutable double _swapElement;

Page 24: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 24

Инициализация экземпляра класса

Класс – тип данных.

Объект – переменная этого типа (автоматическая или статическая).

Для инициализации состояния объекта в момент его создания существуетспециальный метод – конструктор.

Конструктор имеет то же имя, что и имя класса.

Тип возвращаемого значения для конструктора не указывается (дажеvoid).

Конструктор вызывается в момент создания экземпляра класса(объявление переменной класса или вызов оператора new).

Класс может иметь несколько конструкторов, предоставляющихразличные способы инициализации объекта.

Page 25: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 25

Конструктор по умолчанию

Конструктор, не имеющий параметров, называетсяконструктором по умолчанию

Поля данных в таком конструкторе инициализируютсязначениями по умолчанию

Создавать такой конструктор или не создавать – зависит отконкретной задачи

Page 26: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 26

Пример

class List

{

public:

List()

{ _list=new ListNode; }

List(double ar[])

{// этот конструктор заполняет список элементами массива}

void AddElement(double value);

void RemoveElement(double value);

protected:

ListNode* _list;

};

void main()

{

double array1[]={1,2,3,4,5,6,7,8,9,10};

List list1;

List* list2=new List();

List list3(array1);

List* list4=new List(array1);

}

Page 27: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 27

Списки инициализации

В качестве данных класса могут выступать другие классы (т.н.композиция классов)

Их инициализация осуществляется до выполнения телаконструктора.

Для их инициализации вызываются конструкторы по умолчанию.

Если таковых не имеется, программист должен использовать спискиинициализации:

Применяются для инициализации полей класса в конструкторе довыполнения его тела.

Используются, когда класс содержит внутри себя:

⚫ поля, являющиеся классами без конструкторов по умолчанию

⚫ константы

⚫ ссылки

Page 28: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 28

Пример

class DummyClass

{

public:

DummyClass(int i, int j)

:_i(i) , _someField(j)

{

}

private:

int _i;

AnotherDummyClass _someField;

};

Page 29: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 29

Деинициализация экземпляра класса

В ходе своей работы объект может использовать определенныесистемные ресурсы - динамическая память, открытые файлы,сетевые соединения и т.д.

Для освобождения этих ресурсов служит особый метод класса –деструктор.

Имя деструктора совпадает с именем класса, только перед нимуказывается символ «~»

Данная функция вызывается автоматически приуничтожении экземпляра класса - выход за пределыблока, в котором объявлен экземпляр класса или вызовоператора delete.

Page 30: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 30

Пример

class List

{

public:

List()

{ _list=new ListNode; }

List(double ar[])

{// этот конструктор заполняет список элементами массива}

~List()

{

// Удаление элементов списка

}

void AddElement(double value);

void RemoveElement(double value);

protected:

ListNode* _list;

};

Page 31: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 31

Конструктор копирования

В языке C++ существует специальный тип конструкторов,использующийся для создания копии объекта:

⚫ Явное создание копии объекта программистом

⚫ Неявное создание копии объекта(возврат объекта из функции,передача объекта в функцию по значению и т.д.)

Если не определить конструктор копирования явно, то компиляторсгенерирует его во время компиляции.

Автоматически сгенерированный конструктор копирования осуществляеткопирование всех полей класса, вызывая для них их конструкторыкопирования.

Для создания собственного конструктора копирования используетсяследующий синтаксис.

ClassName(ClassName const& <переменная>)

Page 32: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 32

Пример

class DummyClass

{

public:

DummyClass(int i, int j)

:_i(i) , _someField(j){}

DummyClass(DummyClass const& dc)

{

_i=dc->GetI();

_someField();

}

int GetI(){return _i;}

private:

int _i;

AnotherDummyClass _someField;

};

Page 33: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 33

Запрещение копирования объектов

Возможны ситуации, когда операция копирования объекта не имеетсмысла и должна быть запрещена:

⚫ Класс, инкапсулирующий сетевое соединение.

⚫ Класс, инкапсулирующий работу с файлом или базой данных.

⚫ Объект должен существовать в единственном экземпляре внутриприложения, например, глобальная конфигурация.

Для запрещения копирования объекта, конструктор копированияобъявляется в закрытой (private) области класса.

Реализацию данного конструктора можно явно не описывать.

class File

{

public:

// …

private:

File(File const&);

// …

};

Page 34: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 34

Описание методов за пределами заголовка класса

Для реализации методов за пределами заголовка класса используетсяоперация доступа «::»

Файл «stack.h»

class Stack

{

public:

void Push(double value);

double Pop();

private:

ListNode* _stack;

};

Файл «stack.cpp»

#include “stack.h”

void Stack::Push(double value)

{

//реализация метода

}

double Stack::Pop()

{

//реализация метода

}

Page 35: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 35

Доступ к полям и методам объекта

Если объект является автоматической переменной, то используетсяоперация прямого выбора «.»

Если объект является динамической переменной, то используетсяоперация косвенного выбора «->»

Для доступа к членам класса, объявленным с модификатором static

используется операция доступа «::»

static методы еще называют методами класса, а остальные методами

объекта.

Page 36: C++ Базовый. Занятие 08

http://www.slideshare.net/IgorShkulipa 36

Лабораторная работа №8. Введение в ООП.

Создать классы:

1. Динамический односвязный список.

Реализовать методы:

⚫ Конструкторы и деструктор.

⚫ Добавления и удаления элементов.

⚫ Сортировки списка в порядке возрастания/убывания.

⚫ Вставки в список элемента, не нарушая порядка сортировки.

2. Динамический двусвязный список.

Реализовать методы:

⚫ Конструкторы и деструктор.

⚫ Добавления и удаления элементов.

⚫ Сортировки списка в порядке возрастания/убывания.

⚫ Вставки в список элемента, не нарушая порядка сортировки.