Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 41

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 35 36 37 38 39 40 < 41 > 42 43 44 45 46 47 .. 204 >> Следующая

Чтобы иметь возможность вызова функции GetCoord для объекта типа const, следует включить спецификатор const в определение функции.
class CRectangle {
//...
void GetCoord (int-*L6 int *T6 int *R, int *B) const {
*L = Left; *T = Top;
*R = Right; *B = Bottom; }
// ...
};
Спецификатор const в определении функции GetCoord означает, что функция не может изменять переменные-члены. Если она пытается это сделать, компилятор будет генерировать ошибку при компиляции исходного кода. Функцию GetCoord сейчас можно вызвать для объекта типа const класса Crectangle.
const CRectangle Rect (5, 5, 25, 25); int L, T, R, В;
Rect.GetCoord (&L, ST, SR, &B) ; // допустимо: функция GetCoord
// объявлена как const
Кроме того, можно функцию-член Draw объявить как const, так как она не изменяет значений переменных. Очевидно, имеет смысл добавлять спецификатор const ко всем функциям-членам, которые не модифицируют поля класса, чтобы пользователь мог свободно вызывать такие функции для объектов типа const. Конечно, функцию, подобную CRectangle:: SetCoord, нельзя объявить как const.
Инициализация объектов-членов класса. Можно определить переменную, являющуюся объектом другого класса, т. е. можно встроить объект одного класса в объект другого. Такие переменные называют объектами-членами или встроенными объектами. Его можно инициализировать, передавая требуемые параметры конструктору, помещенному в список инициализации конструктора класса, содержащего объект-член. Например, класс CContainer в следующем примере содержит объект-член класса CEmbedded, инициализируемый в конструкторе класса CContainer.
class CEmbedded
{
//. . .
public:
CEmbedded (int Parml, int Parm2) i
// ...
}
// . . •
};
class CContainer {
private:
CEmbedded Embedded; public:
CContainer (int PI, int P2, int P3) : Embedded (PI, P2) {
// код конструктора ... }
// . . .
};
Если объект-член не инициализирован в списке инициализации конструктора или если конструктор генерируется компилятором, то последний автоматически вызовет для объекта конструктор по умолчанию, если таковой имеется (вспомните: не каждый класс имеет конструктор по умолчанию). Если подобного рода конструктор отсутствует, то компилятор выдаст ошибку.
Примечание
Как будет показано в гл. 5, список инициализации можно также использовать внутри конструктора производного класса, чтобы передать значения в конструктор, принадлежащий базовому классу.
Деструкторы
Можно определить специальную функцию-член, называемую деструктором и автоматически вызываемую всякий раз при уничтожении объекта. Имя деструктора совпадает с именем класса и содержит дополнительный символ префикса По аналогии с конструктором деструктор определяется без задания типа возвращаемого значения (нельзя указать даже void). Однако в отличие от конструктора ему нельзя передавать параметры. Например, если класс называется CMessage, его деструктор определяется следующим образом.
~CMessage {) {
// код деструктора ...
}
Деструктор может выполнять любые задачи, необходимые для удаления объекта. Например, конструктор класса (CMessage) выделяет блок памяти для хранения строки сообщения, а деструктор освобождает память непосредственно перед удалением экземпляра класса.
#include <string.h>
class CMessage {
private:
char *Buffer; // хранит строку сообщения
public:
CMessage () {
Buffer = new char ('\0'); // инициализирует буфер
// пустой строкой
}
-CMessage О // деструктор класса
{
delete (] Buffer; // освобождает память }
void Display () {
// код для отображения содержимого переменной Buffer ...
}
void Set (char *String) // запись новой строки сообщения
{
delete [] Buffer;
Buffer = new char [strlen (String) + 1];
strcpy (Buffer, String);
}
};
Когда вызываются конструкторы и деструкторы
Если говорить в общем, конструктор вызывается при создании объекта, а деструктор - при его уничтожении. В следующем списке подробно перечислены случаи вызова конструкторов и деструкторов для различного вида объектов.
• Объект определен глобально (т. е. вне любой функции). Конструктор вызывается в самом начале программы до вызова функции main (или WinMain в программе, работающей в среде Windows), деструктор — по окончании программы.
• Объект определен локально (т.е. внутри функции). Конструктор вызывается, когда поток управления достигает определения объекта, деструктор - при выходе за пределы блока, в котором определен объект (т.е. когда объект выходит из области видимости).
• Объект определен локально с использованием спецификатора static. Конструктор вызывается, когда поток управления впервые достигает определения объекта, деструктор — в конце программы;
• Объект создан динамически с использованием оператора new. Конструктор вызывается при создании объекта, а деструктор — когда объект явно уничтожается с использованием оператора delete. Если этого не происходит, деструктор не будет вызван никогда.
Массивы объектов
В языке C++ можно определить массив объектов, как показано в следующем примере.
CRectangle RectTable [10];
Предыдущая << 1 .. 35 36 37 38 39 40 < 41 > 42 43 44 45 46 47 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100