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

 

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

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

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

Приведем фрагмент программы, в котором используется класс CBlock.
CBlock Block; // создание экземпляра класса CBlock
Block.SetCoord (25,25,100,100); // установка координат блока
Block. SetColor (5); // установка цвета блока
Block.Draw (); // вызов функции
// Draw класса CBlock
Конструкторы производных классов
Обратите внимание: программа с помощью класса CBlock сначала вызывает функции-члены SetCoord и SetColor для установки значений переменных класса, а затем вызывает функцию Draw для рисования блока. Чтобы упростить использование CBlock, необходимо добавить конструктор для установки значений всех переменных при создании экземпляра класса.
CBlock (int L, int T, int R, int B, int Color) : CRectangle (L, T, R, B) {
SetColor (Color); }
Список инициализации членов класса в данном конструкторе содержит вызов конструктора базового класса CRectangle, которому передаются значения, присваиваемые переменным-членам. Список инициализации может использоваться для инициализации как базового класса, так и переменных членов (рассматривался в параграфе "Инициализация переменных-членов в конструкторах" гл. 4). Конструктор класса CBlock содержит вызов функции SetColor, которая устанавливает значение переменной FillColor. Теперь, используя конструктор класса, можно создать объект класса CBlock и задать блок всего двумя операторами.
CBlock Block (25, 25, 100, 100, 5) ; Block.Draw ( );
Можно также добавить конструктор по умолчанию, присваивающий нулевые значения всем переменным-членам класса.
CBlock () {
FillColor = 0; }
Так как конструктор по умолчанию явно не инициализирует базовый класс (список инициализации пуст), компилятор автоматически вызывает конструктор по умолчанию базового класса (CRectangle: : CRectangle ()), присваивающий нулевые значения всем переменным, определенным внутри него. Если базовый класс не имеет конструктора по умолчанию, то будет получено сообщение об ошибке.
Конструктор по умолчанию класса CBlock позволяет создавать объекты, в которых все переменные-члены равны нулю, без передачи значений или вызова методов класса.
CBlock Block; // создается объект класса CBlock, у которого всем // переменным-членам присвоены нулевые значения
В конце следующего параграфа приведен листинг 5.2 — полный текст класса CBlock с двумя новыми конструкторами.
Порядок вызова конструкторов и деструкторов
При создании экземпляра производного класса компилятор вызывает конструкторы в следующем порядке.
1. Конструктор базового класса.
2. Конструкторы всех объектов-членов (т.е. тех элементов класса, которые являются объектами классов). Эти конструкторы вызываются в порядке перечисления объектов в определении класса.
3. Собственный конструктор класса.
Деструкторы, если они определены, вызываются в обратной последовательности.
Таким образом, если код конструктора выполнен, можно быть уверенным в том, что базовый класс и его члены уже инициализированы и их использование допустимо. Аналогично, если выполнен код деструктора, то можно быть уверенным в том, что базовый класс и все объекты-члены еще не уничтожены и их по-прежнему можно использовать.
Доступ к наследуемым переменным
Даже если класс CBlock наследует переменные-члены Left, Top, Right и Bottom из своего базового класса, это не означает возможности прямого доступа, так как они определены в базовом классе как закрытые. Вместо этого пришлось бы использовать открытую функцию GetCoord, как и в остальной части программы. Такое ограничение приводит к тому, что код функций-членов становится в определенной степени неэффективным. В качестве альтернативы можно указать спецификатор доступа protected вместо private (листинг 5.1).
Листинг 5.1
// CRectl.h: файл заголовков класса CRectangle
class CRectangle
{
protected:
int Left,
int Top;
int Right;
int Bottom; public:
CRectangle () {
Left = Top = Right = Bottom = 0; }
CRectangle (int L, int T, int R, int B) {
SetCoord (L, T, R, B); }
void Draw (void);
void GetCoord (int *L, int *T, int *R, int *B) {
*L = Left; *T = Top; *R = Right; *B = Bottom; }
void SetCoord (int L, int T, int R, int B);
};
Напомним: в данной версии класса CRectangle предполагается определение методов Draw и SetCoord вне класса. Подобно закрытым членам, к защищенным членам класса доступ извне невозможен. Приведенный ниже способ обращения к переменной является некорректным.
void main ( ) {
CRectangle Rect;
Rect.Left = 10; // ОШИБКА: доступ к защищенному // члену класса невозможен
}
Однако в отличие от закрытых к защищенным членам класса можно непосредственно обращаться из класса, производного от того класса, в котором данная переменная определена. Следовательно, CBlock можно переписать, используя прямой доступ к переменным-членам, определенным в CRectangle (листинг 5.2).
Листинг 5.2
// CBlock.h: файл заголовков класса CBlock #include "crectl.h" #include <stdlib.h>
void Fill (int X, int Y, int Color);
class CBlock: public CRectangle {
protected:
int FillColor; public:
CBlock () (
FillColor = 0; }
Предыдущая << 1 .. 40 41 42 43 44 45 < 46 > 47 48 49 50 51 52 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100