|
Программирование >> Дополнительные возможности наследования
Явсшш 14.1. Сташвческив пврвмвнныв-чяены 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 Листинг 14.1. Статические переменные-члены ftinclude <iostream.h> class Cat { public: Cat(int age):itsAge(age){ HowManyCats++; } virtual CatO { HowManyCats--; } virtual int GetAgeO { return itsAge; } virtual void SetAge(int age) { itsAge = age; } static int HowManyCats; private: int itsAge; int Cat::HowManyCats = 0; int main() { const int MaxCats = 5; int i; Cat CatHouse[MaxCats]; for (1 = 0; KMaxCats; 1++) CatHouse[i] = new Cat(i); for (i = 0; KMaxCats; i++) { cout There are ; cout Cat::HowManyCats; cout cats left!\ n ; cout Deleting the one which is ; cout CatHouse[i]->GetAge(); cout years old\ n ; delete CatHouse[i]; CatHouse[i] = 0; return 0; , There are 5 cats left! Deleting the one which is 0 years old There are 4 cats left! Deleting the one which is 1 years old There are 3 cats left! Deleting the one which is 2 years old f There are 2 cats left! Deleting the one which is 3 years old There are 1 cats left! Deleting the one which is 4 years old Обычный класс Cat объявляется в строках 5-17. С помощью ключевого слова static в строке 12 объявляется статическая переменная-член HowManyCats типа int. Объявление статической переменной HowManyCats само по себе не определяет никакого целочисленного значения, т.е. в памяти компьютера не резервируется область для данной переменной при ее объявлении, поскольку, по сути, она не является переменной-членом конкретного объекта Cat. Определение и инициализация переменной HowManyCats происходит в строке 19. Не забывайте отдельно определять статическую переменную-член класса (весьма распространенная ошибка среди начинающих программистов). В противном случае редактор связей во время компиляции профаммы вьщаст следующее сообщение об ошибке: undefined symbol Cat:;HowManyCats Обратите внимание, что для обычной переменной-члена itsAge не требуется отдельное определение, поскольку обычные переменные-члены определяются автоматически каждый раз при создании объекта Cat, как, например, в строке 26. Конструктор объекта Cat, объявленный в строке 8, увеличивает значение статической переменной-члена на единицу. Деструктор, объявленный в строке 9, уменьшает это значение на 1. Таким образом, в любой момент времени переменная HowManyCats отражает текущее количество созданных объектов класса Cat. В строках профаммы 21-40 создается пять объектов Cat, указатели на которые заносятся в массив. Это сопровождается пятью вызовами конструктора класса Cat, в результате чего пять раз происходит приращение на единицу переменной HowManyCats, начиная с исходного значения 0. Затем в профамме цикл for последовательно удаляет все обьекты Cat из массива, предварительно выводя на экран текущее значение переменной HowManyCats. Вывод начинается со значения 5 (ведь было создано пять объектов) и с каждым циклом уменьшается. Обратите внимание: переменная HowManyCats объявлена как public и может вызываться из функции main(). Однако нет веских причин объявлять эту переменную-член таким образом. Если предполагается обращаться к статической переменной только через обьекты класса Cat, предпочтительней сделать ее закрытой вместе с другими переменными-членами и создать открытый метод доступа. С другой стороны, если необходимо получать прямой доступ к данным без использования объекта Cat, то можно либо оставить ее открытой, как показано в листинге 14.2, либо создать статическую функцию-член. Реализация последнего варианта рассмафивается далее в этой главе. Листинг 14.2. Доступ к статическим ЧАСнам Оез нсноАЬзовання оОъвктов Листинг 14,2, Статические переменные-члены Sinclude <iostream.h> class Cat { public: 31 : 41 : Cat(int age):itsAge(age){ HowManyCats++: } virtual CatO ( HowManyCats--; } virtual int GetAgeO { return itsAge; } virtual void SetAge(int age) {itsAge = age;} static int HowManyCats; private: int itsAge; int Cat::HowManyCats = 0; void TelepathicFunctionO; int mainO { const int MaxCats = 5; int 1; Cat *CatHouse[MaxCats]; for (i = 0; KMaxCats; 1++) { CatHouse[i] = new Cat(i); TelepathicFunction(); for ( i = 0; KMaxCats; i++) { delete CatHouse[i]; TelepathicFunctionO; return 0; void TelepathicFunctionO ( cout << There are ; cout << Cat::HowManyCats cats alive!\ n There There There There There There There There There There are 1 are 2 are 3 are 4 are 5 are 4 are 3 are 2 are 1 are 0 cats cats cats cats cats cats cats cats cats cats alive! alive! alive! alive! alive! alive! alive! alive! alive! alive!
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |