Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 400107.doc
Скачиваний:
5
Добавлен:
30.04.2022
Размер:
568.32 Кб
Скачать
      1. Компоненты классов. Доступ к ним.

Начиная с этого параграфа (если не оговорено другое) под классом понимаем класс общего вида, т.е. объявленный ключом класса class и содержащий в качестве компонентов данные и функции. Среди функций выделяют конструкторы и деструкторы. Их назначение аналогично Turbo Pascal. В объявлениях классов могут быть использованы атрибуты доступа private, protected, public. При отсутствии названных атрибутов:

для ключа-класса class все компоненты (как данные, так и функции) имеют атрибут доступа private, допустимы все атрибуты;

для ключа-класса struct доступ по умолчанию устанавливается public, но допустимы и другие значения;

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

Любой атрибут доступа действует до следующего атрибута. Внутри класса атрибуты private и protected равнозначны. Отличае между ними имеет значение при использовании базовых и порожденных классов. К компонентам с атрибутом private (protected) имеют доступ только функции-члены класса и дружественные функции. Дружественной является функция, имеющая в своём описании атрибут friend. Атрибут friend позволяет приравнивать функции, объявленные за пределами данного класса, функциям, объявленным внутри класса, по доступу к компонентам private.

К компонентам с атрибутом public могут иметь доступ любые функции, к этим компонентам можно обращаться извне класса. Однако, остаётся в силе рекомендация: прямые обращения к данным класса извне нежелательны. Данные класса должны обрабатываться функциями класса.

Атрибут public целесообразно присвоить функциям, образующим интерфейс с классом. “Внутренность” класса целесообразно закрыть от пользователя, т.е. присвоить им атрибут private (protected). Примеры объявления связанных классов:

enum Boolean {false, true} //две целые константы false 0 и true 1

class Location

{ protected: //закрытая часть

int X,Y; //координаты

public: //открытая часть

Location (int InitX, int InitY); //конструктор

Int GetX ();

Int GetY ();

};

class Point :public Location //public – атрибут доступа

{ //Location – имя базового класса protected:

Boolean Visible; //признак видимости

public:

Point (int InitX, int InitY); //конструктор

void Show();

void Hide();

Boolean IsVisible();

void MoveTo (int NewX,int NewY);

};

class Circle :public Point //Point – имя базового класса

{

int Radius;

public:

Circle (int InitX,int InitY,int InitRadius);

void Show (void);

void Hide (void);

void MoveTo (int NewX,int NewY);

};

//функции - члены класса Location

Location::Location (int InitX,int InitY)

{X=InitX; Y=InitY;}

int Location::GetX(void)

{return X;}

int Location::GetY(void)

{return Y;}

//функции – члены класса Point

Point::Point (int InitX,int InitY): Location (InitX, InitY)

{

Visible=false; //конструктор Point вызывает

//конструктор Location, а затем

//помечает точку как невидимую

}

void Point::Show(void)

{

Visible=true;

putpixel (X,Y,getcolor() ); //отображает текущим светом

}

void Point::Hide(void)

{

Visible=false;

putpixel (X,Y,getcolor() );

}

Boolean Point::IsVisible (void)

{return Visible}

void Point::MoveTo (int NewX, int NewY)

{Hide(); //перемещение точки

X=NewX;

Y=NewY;

Show();

}

//функции – члены класса Сircle

{Radius = InitRadius; };

void Circle::Show(void)

{

Visible=true;

circle (X,Y,Radius); //построить на экране окружность

void Circle::Hide (void)

{

unsigned int Color1;

Color1=getcolor(); //хранить код цвета

setcolor(getbkcolor()); //установить текущим цвет фона

Visible=false;

сircle (X,Y,Radius);

setcolor(Color1);

}

void Circle::MoveTo (int NewX, int NewY)

{ //перемещение окружности

Hide()

X=NewX;

Y=NewY;

Show();

}

Класс Location имеет две переменных (X, Y) типа int, их объявление находится в закрытой части, поэтому операции над ними допустимы только из функций Location, GetX, GetY; описание этих функций находится в открытой части класса, их вызов может быть выполнен в любом месте программы, где доступны их имена. Класс Point является порожденным от класса Location (другими словами, класс Location для Point базовый). Перед именем базового класса имеется атрибут доступа public. Класс Рoint имеет 3 переменные (X, Y, Visible) и 8 функций: полученных по наследованию от Location и собственные функции. Класс Circle, в свою очередь, порождён от Point. Перед именем базового класса допустимы атрибуты доступа private и public. Если имеется несколько базовых классов (это допускается в С++, и не допускается в Turbo Pascal), то перед каждым из них может быть свой атрибут доступа. Эти атрибуты не меняют доступа к элементам базовых классов, а только определяют доступ к этим элементам из порожденных классов (табл. 3.2.). Атрибут при списке базовых классов может ужесточить доступ, но не может облегчить. Кроме того, хорошо видна разница между атрибутами private и protected.

Таблица 3.2.

Доступ в базовом

Атрибуты доступа в

списке базовых

Доступ в порождённом

Классе

public

Public

Public

private

Public

не доступен

protected

Public

Protected

public

Private

Private

private

Private

не доступен

protected

Private

Private

Рассмотрим это на примере

class B

{

int a; //private по умолчанию

public:

int b,c;

int Bfunc(void);

};

class X :private B

{ //b, c, Bfunc private для Х

int d; //private по умолчанию

//а не доступно для Х

public:

B::c; //теперь с public

int e;

int Xfunc(void);

};

int Efunc(void); //внешняя функция для Х и В

Функция Efunc может использовать из класса Х c, e, Xfunc (public - элементы).

Функция Xfunc в Х имеет доступ:

c - наследуется ка public;

b, Bfunc - наследуется как private в X;

d, e, Xfunc - собственные элементы X.

Функция Xfunc не имеет доступа к переменной а класса B.