Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Описание объектов

Классы

В этой главе рассматривается фундамент, без которого невозможно написать ни одну объектно-ориентированную программу — синтаксические правила описания объектов. В конце этой части книги мы вернемся к обсуждению принципов ООП и методов проектирования объектных программ, поскольку «только хорошее понимание идей, стоящих за свойствами языка, ведет к мастерству» (Б. Страуструп).

Описание класса

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

Данные класса называются полями (по аналогии с полями структуры), а функции классаметодами1.

Поля и методы называются элементами класса. Описание класса в первом приближении выглядит так:

class < имя >{

[ private: ]

<описание скрытых элементов>

public:

<описание доступных элементов>

}; // Описание заканчивается точкой с запятой

Спецификаторы доступа private и public управляют видимостью элементов класса.

Элементы, описанные после служебного слова private, видимы только внутри класса.

Этот вид доступа принят в классе по умолчанию. Интерфейс класса описывается после спецификатора public.

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


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

Можно задавать несколько секций private и public, порядок их следования значения не имеет.

Поля класса:

· могут иметь любой тип, кроме типа этого же класса (но могут быть указателями или ссылками на этот класс);

· могут быть описаны с модификатором const, при этом они инициализируются только один раз (с помощью конструктора) и не могут изменяться;

· могут быть описаны с модификатором static (об этом рассказывается в разделе «Статические поля», с. 186), но не как auto, extern и register.

Инициализация полей при описании не допускается.

Классы могут быть

· глобальными (объявленными вне любого блока) и

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

Ниже перечислены некоторые особенности локального класса:

1) внутри локального класса можно использовать

· типы,

· статические ( static ) и внешние ( extern ) переменные,

· внешние функции и

· элементы перечислений из области, в которой он описан;

Запрещается использовать автоматические переменные из этой области;

2) локальный класс не может иметь статических элементов;

3) методы этого класса могут быть описаны только внутри класса;

4) если один класс вложен в другой класс, они не имеют каких-либо особых прав доступа к элементам друг друга и могут обращаться к ним только по общим правилам.

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

Для этого требуется задать его свойства ( например, количество щупалец, силу или наличие гранатомета) и поведение. Естественно, пример будет схематичен, поскольку приводится лишь для демонстрации синтаксиса.

class monstr{

int health, ammo;

public:

monstr(int he = 100, int am = 10){ health = he; ammo = am;}

void draw(int x, int y, int scale, int position);

int get_health(){return health;}

int get_ammo(){return ammo;}

};

 

В этом классе два скрытых поляhealth и ammo, получить значения которых извне можно с помощью методов get_health() и get_ammo().

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

Кроме того, очень важной является возможность вносить в эти структуры изменения, не затрагивая интерфейс класса.

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

В приведенном классе содержится три определения методов и одно объявление (метод draw).

Если тело метода определено внутри класса, он является встроенным (inline). Как правило, встроенными делают короткие методы.

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

void monstr::draw(int x, int у, int scale, int position){

/* тело метода */

}

Метод можно определить как встроенный и вне класса с помощью директивы inline (как и для обычных функций, она носит рекомендательный характер):

inline int monstr::get_ammo(){

return ammo;

}

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

Конструктор предназначен для инициализации объекта. Автоматический вызов конструктора позволяет избежать ошибок, связанных с использованием неинициализи-рованных переменных. Мы подробно рассмотрим конструкторы в разделе «Конструкторы», с. 182.

Типы данных struct и union являются видами класса, разница между ними будет объяснена позже, на с. 209. Другой пример описания класса, а также пример локального класса приведен в разделе «Создание шаблонов классов» на с. 211.


Конкретные переменные типа «класс» называются экземплярами класса, или объектами.

Время жизни и видимость объектов зависит от вида и места их описания и подчиняется общим правилам C++:

monstr Vasia; // Объект класса monstr с параметрами по умолчанию

monstr Super(200, 300); // Объект с явной инициализацией

monstr stado[100]; //Массив объектов с параметрами по умолчанию

monstr *beavis = new monstr (10); // Динамический объект

//(второй параметр задается по умолчанию)

monstr &butthead = Vasia; // Ссылка на объект

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

Методы класса не тиражируются.

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


Доступ к элементам объекта аналогичен доступу к полям структуры. Для этого используются

· операция. (точка) при обращении к элементу через имя объекта и

· операция -> при обращении через указатель, например:

int n = Vasia.get_ammo();

stado[5].draw;

cout << beavis -> get_health();

Обратиться таким образом можно только к элементам со спецификатором public. Получить или изменить значения элементов со спецификатором private можно только через обращение к соответствующим методам.

Можно создать константный объект, значения полей которого изменять запрещается. К нему должны применяться только константные методы:

class monstr{

<== предыдущая лекция | следующая лекция ==>
Объектно-ориентированное программирование | Краткая историческая справка
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 454; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.02 сек.