Класс в ООП

Автор работы: Пользователь скрыл имя, 30 Декабря 2010 в 12:17, реферат

Краткое описание

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

Содержимое работы - 1 файл

OOП.docx

— 37.73 Кб (Скачать файл)

Класс в ООП - это абстрактный тип данных, который включает в себя не только данные, но и функции и процедуры. 

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

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

Существует 2 способа  включения метода в класс:

Определение метода при описании класса.

Объявление метода при описании, а его описание - при вызове.  

Методы, определенные внутри класса, являются неявно встроенными.

Пример. 

class A

    {

    int x, y;

    int sum ( ) { return (x + y) ; }

    } ;  

Для определения  метода вне класса укажите имя  класса, за ним знак :: и имя функции-члена. Официальное название двойного двоеточия - оператор разрешения области действия. Он указывает, что данная функция-член является частью определенного класса.

Пример. 

Class B

    {

    int x, y;

   int sum ( )

    } ;

int B::sum ( ) { return (x + y) ; } 

Также как и структуры, классы можно задавать либо статически, либо динамически.

Например,

    статически - Toplist    foo;

    динамически - Toplist *bar ; bar=new Toplist; 

Для статических  и динамических классов применимы  те же правила и принципы, что  и для статических и динамических переменных. 

Объект - экземпляр  класса.

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

Классы содержат данные и методы. В ООП методы и данные одного класса могут передаваться другим классам, т.е. объекты могут  наследовать свойства друг друга. Класс  наследует свойства другого класса, обладает теми же возможностями, что  и класс, от которого он порожден. Этот принцип называется наследованием (inheritance). Порожденный класс называется потомком (descendant), а тот, от кого он порожден - предком (ancestor). Благодаря новым свойствам, которыми дополняется потомок, порожденный класс может обладать большими возможностями, чем его предок. 

Механизм наследования обеспечивает возможность многократного  применения программного кода. Таким  образом, классы могут быть представлены в виде иерархии. Библиотека VLC (Visual Component Library) в Delphi как раз и является такой иерархической системой классов.  

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

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

Инкапсуляция (encapsulation) - объединение данных с функциями, предназначенными для манипулирования этими данными (т.е. поведением) в новом типе - КЛАССЕ . 

Пример.

Представьте, что  Вам надо написать программу, которая  выполняла бы дует духового и струнного инструментов. Для этого определите классы Духовой инструмент и Струнный инструмент. Для класса Духовой инструмент определите, что имеется мундштук и что в него надо дуть, чтоб получить звук. Для класса Струнный инструмент определите, что по струнам надо ударять, чтоб получить звук. Оба класса уже способны "играть музыку", и что это свойство было унаследовано от предка. Они унаследовали метод PlayMusic, который был объявлен и реализован как метод класса Музыкальный инструмент. 

Таким образом, этот метод уже не нужно создавать, и Вам не надо знать код реализации метода, чтобы использовать его в  двух новых классах. Способ, которым  реализована возможность играть музыку, не важен. Этот принцип сокрытия информации (information hiding) характерен для инкапсуляции и существенно облегчает написание больших и стабильно работающих приложений. 

Если класс был  грамотно сконструирован и тщательно  проверен, он может многократно использоваться в различных приложениях. В примере  с музыкальными инструментами это  означает, что каждый класс обладает свойствами класса Музыкальный инструмент, а способы создания звука заключены  внутри него. Эти способы невидимы и недоступны за пределами класса. Также подразумевается, что классы ничего не знают друг о друге. Они  полностью разделены, и им не известны спецификации и свойства друг друга. Духовой инструмент закрыт для любых  попыток других классов использовать его мундштук. Также и струны Струнного  инструмента, и способ их использования  заключены внутри него самого. Объект закрыт, т.е. окружение не может случайно изменить это объект. Смысл этой закрытости в том, что Вы не обязательно  должны знать, как, например, Труба издает звук.  

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

Полиморфизм - многоформенность в Си++; механизм, позволяющий использовать одинаковые имена для сходных по смыслу действий и методов, относящихся к различным объектам (типам и классам). 

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

Например, метод класса Музыкальных инструментов - PlayMusicForAnOrchestra - может быть определен как общим метод, который может использоваться с любой категорией инструментов. Этот метод написан таким образом, что не важно, какой именно инструмент получает задание играть, однако для классов, описывающих конкретные инструменты, данный метод должен быть переопределен (override), что даст возможность определить конкретные действия, учитывая особенности конкретного инструмента.

Идея ООП заключается  в описании задачи на уровне объектов, которые в языке С++ называются классами. Например, класс может описывать объект линию, эллипс, прямоугольник. Но в отличие от структур, которые также могут комплексно описывать свойства каких-либо объектов, между классами возможны взаимодействия, которые выражаются тремя категориями: наследование, полиморфизм и инкапсуляция.  

Наследование –  это механизм создания нового класса на основе ранее созданного. Наследование имеет смысл, если множество разнородных  объектов имеют общие характеристики или функции. Так, в случае с графическими примитивами тип линии, цвет и  толщина описываются одинаково  на уровне языка программирования и  логически отностятся к одной категории – свойства графического примитива. Поэтому эти элементы целесообразно выделить в отдельный класс – базовый и на основе него создавать новые классы – дочерние для более детального описания линии, эллипса и прямоугольника, используя механизм наследования.  

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

Инкапсуляция –  это способ представления класса в виде «черного ящика». Это значит, что конечному пользователю класса (программисту) доступен лишь определенный набор функций и переменных для  работы с классом. Часто ограничение  доступа применяется для записи значений в переменные класса через  функции, при запрещенном непосредственном доступе к переменным.  

Класс в языке  С++ задается с помощью ключевого слова class, за которым следует его имя и в фигурных скобках {} дается его описание. После определения класса ставится точка с запятой. Ниже приведен пример описания класса для хранения координат графических примитивов:  

class CPos

{

int sp_x, sp_y; //координата начала

int ep_x, ep_y; //координата конца

};  

Каждый класс имеет  специальные функции, которые называются конструктор и деструктор. Конструктор  класса вызывается всякий раз, когда  объект создается в памяти ЭВМ  и служит обычно для инициализации  данных класса. Конструктор имеет  то же имя, что и имя класса. Деструктор вызывается при удалении класса из памяти и используется, как правило, для освобождения ранее выделенной памяти под какие-либо данные этого  класса. Имя деструктора совпадает  с именем класса, но перед ним  ставится символ ‘~’. Рассмотрим пример реализации конструктора и деструктора  для класса CPos.  

class CPos

{

public:

CPos() {printf(“Вызов конструктора.\n”);}

~CPos() {printf(“Вызов деструктора.\n”);}  

int sp_x, sp_y; //координата начала

int ep_x, ep_y; //координата конца

};  

Здесь ключевое слово  public используется для обеспечения общего доступа к функциям и переменным класса.  

Для создания нового экземпляра класса в памяти ЭВМ используется оператор new языка С++, а для удаления – оператор delete. Использование данных операторов для создания экземпляра класса CPos и его удаления выглядит следующим образом:  

CPos *pos_ptr = new CPos(); //создание объекта

delete pos_ptr; //удаление объекта  

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

Вызов конструктора.

Вызов деструктора.  

Экземпляр класса также  можно создать подобно обычным  переменным без использования указателей, как показано ниже  

CPos pos;  

В этом случае переменная pos называется представителем класса, у которого также вызывается конструктор при его создании и деструктор при его удалении из памяти.  

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

class CPos

{

public:

CPos(int x1, int y1, int x2,int y2)

{

sp_x = x1; sp_y = y1;

ep_x = x2; ep_y = y2;

}

~CPos() {}  

int sp_x, sp_y;

int ep_x, ep_y;

};  

и процесс создания экземпляра класса принимает вид:  

CPos *pos_ptr = new CPos(10,10,20,20);  

или  

CPos pos(10,10,20,20);  

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

class CPos

{

public:

CPos() {}

CPos(int x1, int y1, int x2,int y2)

{

sp_x = x1; sp_y = y1;

ep_x = x2; ep_y = y2;

}

~CPos() {}  

int sp_x, sp_y;

int ep_x, ep_y;

};  

В классах помимо переменных, конструкторов и деструкторов можно задавать описания и обычных  функций, которые, в этом случае, называются методами. Например, в классе CPos для задания значений координат примитива целесообразно добавить функцию для ввода значений в переменные sp_x, sp_y, ep_x и ep_y. Это позволит, во-первых, не запоминать программисту имена этих переменных, а оперировать только одной функцией и, во-вторых, в самой функции можно реализовать необходимые проверки на истинность переданных значений координат перед их присваиванием переменным. Такую функцию можно описать в классе следующим образом:  

class CPos

{

public:

CPos() {}

~CPos() {}  

void SetParam(int x1, int y1, int x2, int y2)

{

if(x1 >= 0 && x1 <= MAX_SIZE) sp_x = x1;

if(y1 >= 0 && y1 <= MAX_SIZE) sp_y = y1;

if(x2 >= 0 && x2 <= MAX_SIZE) ep_x = x2;

Информация о работе Класс в ООП