Тема 3. Класс как абстрактный тип 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Тема 3. Класс как абстрактный тип



 

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

Класс – это производный структурированный тип на основе уже существующих типов. Простейшим способом класс можно определить с помощью конструкции:

ключ_класса имя_класса {список_компонентов};

где ключ_класса – одно из служебных слов class, struct, union;

имя_класса – произвольно выбираемый идентификатор;

список_компонентов – определения и описания типизированных данных и принадлежащих классу функций.

Компоненты определяют состояние объекта и обуславливают поведение объекта класса. Компонентами класса могут быть данные, функции, классы, перечисления, битовые поля, дружественные функции, дружественные классы и имена типов. Например:

 

class Classid // класс с именем Classid

{ int k;

double x,y; //x,y,k - закрытые члены –данные по умолчанию

public:

char lit,ch;

int f3(int, int); //lit, ch – открытые члены-данные

int getx(void)

{r eturn x;}

private:

void f1(void); //закрытые члены-методы класса

int f2(int);

};

 

Спецификатор доступа private: и public: определяют режим доступа к членам класса: private – делает члены класса закрытыми, а public – открытыми. К закрытым членам класса имеют доступ только методы данного класса, а также функции-друзья класса. Открытые члены класса доступны любым функциям. Они предназначены для общения объектов класса с программой, в которой они существуют.

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

Определения методов обычного класса могут находиться непосредственно внутри определения класса и в таком случае они автоматически считаются подставляемыми. Подставляемые функции следует использовать, если функция очень простая и короткая, например, функция getx().

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

int getx(void) { return x;}

возвращающий значение закрытого члена-данного х.

Целесообразно «тощие» тела таких методов помещать внутрь определения класса, сделав их для повышения эффективности подставляемыми. В случае определения подставляемых методов вне определения класса, в заголовок методов добавляется спецификатор inline.

Следуя технологии «клиент-сервер» определение методов класса следует располагать вне определения класса. С помощью оператора разрешения области видимости «::» компилятору сообщается, к какому классу принадлежит данный определяемый метод, например:

int Classid::f2(int x)

{ тело метода }

Определение класса не создает объектов данного класса. Объекты создаются только путем их определения, например:

 

Classid obj1, obj2, obj-array[10];

 

Размер объекта в памяти определяется суммой размеров нестатических членов-данных класса. Методы класса не занимают место в области памяти, выделенной для объекта класса!

При работе с программными проектами, состоящими из нескольких файлов, определение класса должно присутствовать во всех файлах, где используются объекты данного класса или определяются его методы. Поэтому целесообразно помещать определение класса в заголовочный файл (header file), включаемый при помощи директивы # include в те файлы, в которых оно необходимо. Если определение метода класса находится вне определения класса, то он обязательно должен быть определен в тех файлах, где используется. Определение такого метода лучше поместить в заголовочный файл вместе с определением класса.

Доступ к открытым членам объекта некоторого класса осуществляется при помощи операторов прямого “.” и косвенного “->” выбора.

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

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

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

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

Параметром конструктора не может быть его собственный класс, но может быть ссылка на него, как у конструктора копирования.

Чтобы компонент-данное класса был в единственном экземпляре и не тиражировался при создании каждого нового объекта класса, он должен быть определен в классе как статический, то есть должен иметь атрибут static. Статические компонентные функции класса обеспечивают обращение к static -данным класса без имени конкретного объекта. Static-функции класса сохраняют все основные особенности обычных(нестатических) компонентных функций.

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

 

имя_класса* const this = адрес_обрабатываемого_объекта;

 

Ситуации, в которых проявляется полезность применения указателя this:

· когда имя компонента-данного класса совпадает с именем формального параметра функции класса;

· когда в теле функции класса нужно явно задать адрес того объекта, для которого эта функция была вызвана;

· в качестве параметра функции, когда конкретное имя объекта, в момент написания этой функции класса, недоступно (вместо передачи такой функции ссылки или указателя на нужный объект.).

· когда функция, в качестве своего результата, возвращает объект.

·

Основная литература - 5[гл.9,281-315], 6[гл.1, 6-15].

Контрольные вопросы:

1. Если определить два объекта некоторого класса, то могут ли они иметь различные(одинаковые) значения своих членов-данных?

2. Как бы выглядел заголовок определения метода getx() класса Classid, который не принимает никаких параметров и возвращает целое значение? Считайте, что определение метода помещается вне блока класса.

3. Какие члены-данные класса следует инициализировать одновременно с инициализацией конструктора, а какие инициализировать в теле конструктора?

4. Почему одни методы класса определяются в блоке класса, а другие за его пределами?

5. Что представляет собой указатель this?

 



Поделиться:


Последнее изменение этой страницы: 2016-12-13; просмотров: 203; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.206.3.58 (0.007 с.)