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 – это предопределенный указатель на текущий объект внутри класса. Для того, чтобы получить доступ к элементам данных класса из программного кода, который находится вне класса, нужно описать частный экземпляр класса. Следовательно, компилятор знает, какая копия данных доступна. Пример: