Class CRectangle

Class CMessage

Class CO2

Class CO1

{ public:

CO1(int Par1, int Par2)

{

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

}

}

{ private:

CO1 Obj1;

public:

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

{

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

}

}

 

Деструкторы

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

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

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

Пример:

#include<string.h>

{ private:

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

public:

CMessage()

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

{ Buf=new char(‘

~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-Методы

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

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

Пример:

{ 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 – это предопределенный указатель на текущий объект внутри класса.

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

Пример: