Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция9.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
124.42 Кб
Скачать

Int &rInt;

public:

C(int P): N(P), CInt(5), RInt(N)

{// Код конструктора }

}

Использование:

C CObject(0);

Создается объект с параметрами: N=0, CInt=5, &RInt=N

Объекты const и методы const

Добавление const в определении объекта класса означает, что вы не можете изменить значение любых компонент данного класса.

Пример:

const CRectangle Rect(25,25,100,100);

// установка значений только один раз при

// инициализации

int L, T, R, B;

Rect.GetCoord(&L, &T, &R, &B);

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

Чтобы иметь возможность вызвать GetCoord для объекта const, нужно включить ключевое слово const в определение функции.

Class CRectangle

{ // ****

Void GetCoord() const

{

// *****

}

}

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

Инициализация объектов – компонентов класса

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

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

Например, класс CO2 содержит объект-компонент класса CO1, который инициализируется конструктором CO2:

class CO1

{ public:

CO1(int Par1, int Par2)

{

// Код конструктора для CO1

}

}

class CO2

{ private:

CO1 Obj1;

public:

CO2 (int P1, int P2, int P3): CO1(P1, P2)

{

// Код конструктора для CO2

}

}

Деструкторы

Деструктор – это метод класса, автоматически вызываемый при удалении объекта.

Имя деструктора=~имя_класса

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

Пример:

#include<string.h>

class CMessage

{ private:

char *Buf; // хранит строку сообщения

public:

CMessage()

// инициализирует Buf пустой строкой

{ Buf=new char(‘\0’); }

~CMessage()

// освобождает память

{ delete [] Buf; }

Void Display()

// отображает содержимое Buf

{ cout<<Buf<<endl; }

Void Set (char *String)

// устанавливает новую строку сообщения

{

Delete [] Buf;

Buf=new char [strlen(String)+1];

Strcpy(Buf, String);

}

}

Когда вызываются конструкторы и деструкторы

В общем случае конструктор вызывается при создании объекта, а деструктор – при разрушении объекта.

Специальные случаи:

  1. Для глобального объекта (объявленного вне функций) конструктор вызывается в начале выполнения программы перед входом в main, а деструктор – при выходе из программы.

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

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

  4. Для динамического объекта с использованием оператора new, конструктор вызывается при создании объекта, а деструктор вызывается, когда объект явно разрушается с использованием оператора delete (если не удалять объект, то деструктор вызываться не будет).

Массивы объектов

Пример:

CRectangle RectTab[10];

CRectangle *PRectTab=new CRectangle [10];

Компилятор вызывает конструктор по умолчанию для каждого элемента массива.

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

Удаление динамического массива:

delete [] PRectTab;

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

Inline-Методы

Метод класса можно объявить внутри класса, а определить вне класса.

Если метод определяется вне класса, нужно поставить перед именем функции имя класса с оператором расширения области видимости (::).

Пример:

class CRectangle

{ private:

int Left, Top, Right, Bottom;

public:

void Draw();

void SetCoord(int L, int T, int R, int B);

void GetCoord(int *L, int *T, int *R, int *B)

CRectangle(int L, int T, int R, int B);

CRectangle();

}

CRectangle::CRectangle()

{ Left=Top=Right=Bottom=0; }

CRectangle::CRectangle(int L, int T, int R, int B)

{ SetCoord(L, T, R, B); }

void CRectangle::Draw()

{ Line(Left, Top, Right, Top);

Line(Right, Top, Right, Bottom);

Line(Right, Bottom, Left, Bottom);

Line(Left, Bottom, Left, Top);

}

void CRectangle::SetCoord (int L, int T, int R, int B)

{ Left=L; Top=T; Right=R; Bottom=B; }

void CRectangle::GetCoord (int *L, int *T, int *R, int *B)

{ *L=Left; *T=Top; *R=Right; *B=Bottom; }

Функция, которая определена вне класса, по умолчанию обрабатывается как не inline. Для ее обработки как inline-функции нужно указать ключевое слово inline.

Пример:

// внутри класса

void inline CRectangle::GetCoord (int *L, int *T, int *R, int *B);

// вне класса

void inline CRectangle::GetCoord (int *L, int *T, int *R, int *B)

{ *L=Left; *T=Top; *R=Right; *B=Bottom; }

Организация исходных файлов

Определение класса вместе с определениями любых inline-методов помещается в заголовочном файле, имеющем расширение *.h. Заголовочный файл включается в каждый файл исходного кода, в котором вызывается класс. Такая организация обеспечивает доступ к определению класса и коду любой inline-функции при вызове класса или метода. Определения любых не inline-методов внутри отдельного файла исходного кода C++ включается в файл реализации класса. Все файлы компонуются путем включения в проект.

Указатель this

Указатель this – это предопределенный указатель на текущий объект внутри класса.

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

Пример:

class CTest

{ public: int N;

// N указывается без ссылки на объект

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