Для каждого указателя сначала операцией new создается динамический объект типа ТМоnеу, и только после этого выполняется инициализация — в данном случае без создания динамического объекта инициализировать нельзя. Это и понятно: у нас объявлены только указатели, а не сами объекты.
Объект создается вызовом конструктора — об этом сигнализируют круглые скобки после имени ТМопеу(). Отметим, что разрешается создавать объект, не показывая «лишних» скобок, например:
TMoney *pt = new ТМопеу,*рр,*ps; // объявление указателей
pp = new ТМопеу; ps = new ТМопеу; // создание объектов
Однако тут нас, как всегда, подстерегает очередной «сюрприз», которыми так богат язык С++. Например:
TMoney *pt = new TMoneyO:
Это объявление не эквивалентно следующему:
TMoney *pt = new TMoney:
В первом случае выделяемая память инициализируется нулями, а во втором случае — нет. В этом легко убедиться, выполнив вывод значений на экран:
TMoney *pt = new TMoneyO: pt->DisplayMoney(); TMoney *ps = new TMoney: ps->DisplayMoneyO;
У меня на домашнем компьютере (Visual C++.NET 2003, режим Debug) на экран выводится следующее:
0.00 руб.
-62774385622041946822886424226644088866868024608228064048624264404.48 руб.
Совершенно очевидно, какой способ создания динамических переменных следует предпочесть.
В конце работы объекты надо, естественно, уничтожить, возвратив память системе.
Мы можем задействовать класс и для объявления полей в другом классе. В объектно-ориентированном программировании использование некоторого класса для определения полей в другом классе называется включением, или композицией. Например, в банковской системе может быть реализован класс Счет, обязательными полями которого являются номер счета и сумма на счете. Упрощенное определение такого класса представлено в листинге 1.21.
Листинг 1.21. Определение класса Счет
typedef unsigned long ulong: class TCount
{ TMoney Summa: // сумма на счете
ulong NumberCount: // номер счета
public:
void DisplayCountO // вывод на экран
{ cout << "Number: "<< NumberCount<<". Summa: Summa.DisplayMoney();
}
// инициализация
void Init(ulong Number, const TMoney &s)
{ NumberCount = Number:
Summa = s: // присваиваются деньги
}
// сложение денежных сумм на счетах TCount AddSumma(TMoney s) { TCount t = *this:
t.Summa = t.Summa.AddMoney(s); // "вложенный" доступ
return t:
}
};
|