Создание объектов (экземпляров) класса

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

имя_класса имя_переменной;

//объявление переменной типа заданного класса

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

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

имя_класса *имя_указателя - NULL;

Для выделения динамической памяти используется оператор new.

имя_указателя - new имя_класса;

Освобождение ранее выделенной памяти осуществляется оператором delete:

delete имя_указателя;

Доступ к членам класса

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

Рассмотрим, например, класс CPoint — класс, содержащий координаты X и У точки, расположенной в декартовой системе координат. Обратим внимание, что первая буква «С» в имени класса говорит о том, что это имя класса (первая буква от ключевого слова class).

#include class Cpoint

{ //начало определения класса CPoint

private:

//спецификатор доступа для членов класса, доступных только этому классу int х; //член-переменная класса

int у; //член-переменная класса

public:

//спецификатор доступа для членов класса, доступных всей программе void Setx(int _х) //функция-член класса, задающая значение

{

X - _х; //члену-переменной х

}

void SetY(int _у) //функция-член класса, задающая значение

{

у=_у;

}

int GetX()

{

return х;

}

int GetY()

{

return у;

}

};

int main()

{

CPoint A, pA A.SetX(3);

//члену-переменной у //функция-член класса, возвращающая значение

//члена-переменной х //функция-член класса, возвращающая значение

//члена-переменной у //конец определения класса CPoint

&А;

//объявление (создание) объекта А класса СРо1^ //задание значения 3 члену-переменной х объекта А

pA->SetY (7) ; //задание значения 7члену-переменной у объекта А printf("Точка с координатами (%d, %d); ",A.GetX(),

A.GetY()); return 0;

}

В результате работы программы на экран будет выведено следующее сообщение:

Точка с координатами (3, 7);

В данном случае поля х и у объявлены как скрытые (спецификатор private). То есть непосредственно доступ к ним мы не имеем, однако в методах класса (функции SetX (), SetY (), GetX (), GetY () ) можно к ним обращаться. После создания экземпляра класса CPoint А; вызов методов класса осуществляется с использованием операции «.», аналогично при обращении по указателю используется операция «->». Отметим, что если метод не содержит параметров (GetX (), GetY ()), то при их вызове использование круглых скобок обязательно. При их отсутствии будет сгенерирована ошибка компилятора.

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

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

тип_результата имя_класса::имя_метода(список параметров)

{

}

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

где <тип_результата> — тип возвращаемого методом результата; <имя_класса> — имя класса;

<имя_метода> — имя описываемого метода; операция «::» — операция расширения области видимости (указывает на принадлежность метода к определенному классу).

Приведем измененную программу класса CPoint.

#include

class CPoint { I/начало определения класса CPoint

private:

//спецификатор доступа для членов класса, доступных только этому классу int х; //член-переменная класса

int у; //член-переменная класса

public:

//спецификатор доступа для членов класса, доступных всей программе

void SetX(int);

//прототип метода класса задающего значение члену-переменной х

void SetY(int);

//прототип метода класса, задающего значение члену-переменной у int Getx () ; /*прототип метода класса, возвращающего

значение члена-переменной х*/ int GetY () /*прототип метода класса, возвращающего

значение члена-переменной у*/ }; //конец определения класса CPoint

void CPoint::SetX(int _x)

//реализация метода SetX для класса CPoint

{

x =_x ;

}

void CPoint::SetY(int _y)

//реализация метода SetY для класса CPoint

{

y =_y;

}

int CPoint:: GetX () //реализация метода GetX для класса CPoint

{

return x;

}

int CPoint: : GetY () //реализация метода GetY для класса CPoint

{

return у;

}

int main()

{

CPoint А; //объявление (создание) объекта А класса CPoint

A. SetX (3) ; //задание значения 3 члену-переменной x объекта A

A. SetY (7) ; //задание значения 7члену-переменной у объекта А

print f ("Tochka (%d, %d) ; " , A.GetX () , A.GetYO); return 0;

}

Приведем пример динамического создания объекта класса. Определение класса при этом не меняется, а функция main () приобретет следующий вид:

int main()

{

CPoint *рВ = NULL; рВ = new CPoint; pB->SetX(123); pB->SetY(456);

printf("Tochka (%d, delete pB; return 0;

//указатель на объект класса СРо1^ //выделяем память для хранения объекта //задаем параметры объекта

//выводим на экран параметры объекта %&);п",pB->GetX(), pB->GetY());

//освобождаем ранее выделенную память

 
< Пред   СОДЕРЖАНИЕ     След >