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

Post on 06-Apr-2017

81 Views

Category:

Engineering

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Свойства

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

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

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

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

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

Поля

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

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

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

◦ Площадь

◦ Периметр

Методы

◦ Нарисовать

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

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

◦ Повернуть

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

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

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

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

{

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

};

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

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

Принципы ООП

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример: Стек

struct ListNode

{

double value;

ListNode* Next;

};

class Stack

{

public:

void Push(double value);

double Pop();

private:

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

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

ListNode* _stack;

};

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

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

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

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

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

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);

};

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

Полиморфизм

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

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

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;

};

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

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

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

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

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

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

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

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

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

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

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

public

private

protected

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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);

};

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;

}

}

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.

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

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

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

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

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

mutable bool _bChecked;

mutable double _swapElement;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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);

}

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

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

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

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

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

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

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

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

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

⚫ константы

⚫ ссылки

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

Пример

class DummyClass

{

public:

DummyClass(int i, int j)

:_i(i) , _someField(j)

{

}

private:

int _i;

AnotherDummyClass _someField;

};

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

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

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

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

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

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

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;

};

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

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

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

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

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

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

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

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

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

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;

};

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

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

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

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

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

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

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

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

class File

{

public:

// …

private:

File(File const&);

// …

};

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()

{

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

}

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

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

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

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

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

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

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

объекта.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

top related