Описание класса: зоны доступа, свойства, методы...) |
Построение класса
Класс является производным типом данных. Для описания класса используется ключевое слово class. Кроме этого, допустимо с аналогичной целью использовать ключевые слова struct и union. В дальнейшем мы будем пользоваться только ключевым словом class.
В описании класса может содержаться три разновидности зон, задаваемых спецификаторами доступа private, protected и public:
class имя_класса
{
private: // доступны только внутри класса
данные
методы
ргotected: // доступны внутри класса и для производных классов
данные
методы
public: // доступны извне в области действия объекта
данные
методы
};
Спецификаторы доступа определяют права доступа к членам класса. Права доступа одинаковы до появления следующего специ¬фикатора или до конца описания класса. Зоны доступа могут встре¬чаться в описании класса многократно и в любой последовательно¬сти, однако на практике следует использовать не более одной зоны каждого типа. Если спецификатор доступа не указан, то по умолчанию пред¬полагается зона private.
Начнем с небольшого примера. Введем класс Place, описы¬вающий простейший геометрический объект - точку, характеризую¬щуюся только своим местоположением.
class Place
{
private:
int x; // координата х
int y; // координата y
public:
int Getx()
{
return x;
}
int Gety()
{
return y;
}
};
Определение объектов имеет обычный вид, где в качестве типа выступает имя класса:
Place Anypoint; // объект класса Place
Методы класса должны быть объявлены внутри его описания. Само же описание методов может быть встроено внутрь описания классов, или вынесено за его пределы. Так в нашем примере методы Getx(), Gety() описаны внутри класса. Описание методов внутри класса принято в том случае, когда это какие-то короткие методы, в противном случае они описываются вне описания класса:
class Place
{
private:
int x; // координата х
int y; // координата y
public:
int Getx(); //объявление метода Getx() или его прототип
int Gety();//объявление метода Gety() или его прототип
};
int Place::Getx()
{
return x;
}
int Place::Gety()
{
return y;
}
Здесь через :: указывается методы какого класса мы описываем. Метод с именем данного класса находится внутри области действия класса независимо от расположения. Это означает, что в частности x и y из методов Getx(), Gety() – те самые x и y, которые объявлены в классе Place. Методам класса доступны не только элементы данных, но и другие методы класса, которые могут вызывать друг друга.
Данные внутри класса не инициализируются, т. к. описание класса – это всего лишь шаблон, и память для него будет выделена только при создании экземпляра, или объекта класса. В таком случае было бы ошибкой:
class Place
{
private:
int x=10; // координата х
};
Введем дополнительный метод Move, который будет инициализировать значения x и y.
class Place
{
private:
int x; // координата х
int y; // координата y
public:
int Getx(); //объявление метода Getx() или его прототип
int Gety();//объявление метода Gety() или его прототип
void Move(int newx, int newy);
};
void Place::Move (int newx, int newy)
{
x=newx;
y=newy;
}
Вызывая метод Move мы сможем инициализировать x и y, и менять их текущие значения.
Доступ к членам класса
Способ доступа к членам класса существенно зависит от того, производится он из функции, принадлежащей классу, или из какой-либо другой функции. В первом случае доступ осуществляется непо¬средственно, без использования дополнительных операций. Примеры доступа к элементам x и y уже были даны при рассмотрении класса Place.
Для того чтобы использовать метод или элемент данных класра извне класса, существуют четыре механизма, каждому из которых соответст¬вует своя операция: '.', '->'. Допустимым является доступ лишь к public-членам любого класса. Это касается \ как функций, так и данных.
Первый механизм с использованием операции точка '.' имеет синтаксис:
имя_объекта.класс::имя_метода(список параметррв); имя_объекта.класс::элемент_данных;
Имя класса с операцией области действия ': :' обычно может быть опущено. Вместе с тем имя объекта обязательно должно быть указано - ведь обработке подлежит конкретный объект. Вызов методов класса будет иметь вид для объекта Anypoint:
Place Anypoint;
Anypoint.Getx();
Anypoint.Gety() ;
а доступ к данным
int x = Anypoint.x; //если х в зоне public
int y = Anypoint.y; //если у в зоне public
Если имеется указатель на объект, можно применять другой ме¬ханизм доступа и операцию '->' :
имя указателя->имя_метода(список параметров);
имя_указателя->элемент_данных;
Например:
Place Loc, *Pnt = &Loc; //определение указателя
int m = Pnt->Gety () ; // вызов метода
int z = Pnt->x; // если х находите» в зоне public
В языке C++ имеются также две операции '. *' и '->*'; при помощи которых осуществляется косвенный (без указания имени) доступ к членам класса. Эти операции применяются достаточно ред¬ко.
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |