Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5fan_ru_Obektno-orientirovannoe_programmirovan...doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
351.74 Кб
Скачать

3.2 Объявление класса.

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

Ключ_класса имя_класса<: базовый список>

{

список элементов

};

где

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

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

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

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

С++ позволяет также неполное объявление класса, например:

class X;

stuct Y;

union Z;

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

Все компоненты класса в английском языке обозначаются термином member (член, элемент, часть). Функции, принадлежащие классу, обозначаются термином member function, а данные класса имеют название data members. В русском языке терминология, относящаяся к классам, недостаточно устоялась, поэтому в литературе имеются многочисленные расхождения. Данные класса называют компонентными данными или элементами данных объектов класса. Принадлежащие классу функции называют методами класса или компонентными функциями.

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

Например, объявим класс “вектор”:

Листинг 3.1.

class V_3d

{

// описания элементов-данных объединены в одном операторе

double x,y,z; // координаты вектора в трехмерной системе координат

public:

// функция – метод класса для вычисления модуля вектора

double mod( )

{

return sqrt (x*x+y*y+z*z);

};

};

Таким объявлением класса определен не просто отдельный объект – трехмерный вектор, а любой произвольный вектор. Здесь задан целый класс объектов.

Примечание.

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

Служебное слово public делит тело класса на две части. Первая часть, до слова public по умолчанию является закрытой. Это означает, что имена в этой части – x, y, z могут использоваться только функциями – методами класса. Вторая, открытая часть, составляет интерфейс к объекту класса. Служебное слово public определяет, что метод класса – функция mod( ) является общедоступной, то есть может быть вызвана из любого места программы.

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

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

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

3.3. Управление доступом к элементам класса

Элементы класса получают атрибуты доступа, либо по умолчанию (в зависимости от ключа класса) либо при использовании спецификаторов доступа:

public (общедоступный),

private (собственный),

protected (защищенный).

Спецификатор public означает, что элементы общедоступны всем функциям, в том числе и не методам класса.

Спецификатор private определяет, что элементы могут быть использованы только функциями методами и “друзьями” классов.

Спецификатор protected определяет те же права доступа, что и private, но дополнительно элементы могут быть использованы и методами- наследниками данного класса. Защищенные (protected) элементы классов нужны только в случае построения иерархии классов. Если наследование классов не используется в программе, то применение спецификатора protected эквивалентно использованию спецификатора private.

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

- class-определяет право доступа как private;

- struct- определяет право доступа как public, но можно переопределить это умолчание при помощи спецификаторов доступа private и protected;

- union- определяет право доступа как public и переопределить его нельзя.

Хорошим стилем в ООП является сокрытие данных и общедоступность методов для вызова их из любого места.

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

Листинг 3.2.

class Х {

int i; // i и ch имеют по умолчанию право доступа

char ch; // private

public:

int j; // j и k являются общедоступными

int k;

protected:

int l;..// l объявлен как защищенный элемент

};

struct Y

{

int i; // i по умолчанию имеет право доступа public

private:

int j; // j объявлен как защищенный элемент класса

public:

int k; // k является общедоступным элементом

};

union Z

{

int i; // public по умолчанию, других

double d; // вариантов нет

};

3.4 Объекты классов

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]