Читаем Освой самостоятельно С++ за 21 день. полностью

Статические функции-члены

Статические функции-члены подобны статическим переменным-членам: они не принадлежат одному объекту, а находятся в области видимости всего класса. Именно поэтому их можно вызывать даже в тех случаях, когда не было создано ни одного объекта класса, как показано в листинге 14.4.

Листинг 14.4. Статические функции-члены

1: // Листинг 14.4. Статические функции-члены

2:

3: #include

4:

5: class Cat

6: {

7:    public:

8:       Cat(int age):itsAge(age){ HowManyCats++; }

9:       virtual ~Cat { HowManyCats--; }

10:      virtual int GetAge { return itsAge; }

11:      virtual void SetAge(int age) { itsAge = age; }

12:      static int GetHowMany { return HowManyCats; }

13:   private:

14:      int itsAge;

15:      static int HowManyCats;

16: };

17:

18: int Cat::HowManyCats = 0;

19:

20: void TelepathicFunction;

21:

22: int main

23: {

24:    const int MaxCats = 5;

25:    Cat *CatHouse[MaxCats]; int i;

26:    for (i = 0; i

27:    {

28:       CatHouse[i] = new Cat(i);

29:       TelepathicFunction;

30:    }

31:

32:    for ( i = 0; i

33:    {

34:       delete CatHouse[i];

35:       TelepathicFunction;

36:    }

37:    return 0;

38: }

39:

40: void TelepathicFunction

41: {

42:    cout << "There are " << Cat::GetHowMany << " cats alive!\n";

43: }


Результат:

There are 1 cats alive!

There are 2 cats alive!

There are 3 cats alive!

There are 4 cats alive!

There are 5 cats alive!

There are 4 cats alive!

There are 3 cats alive!

There are 2 cats alive!

There are 1 cats alive!

There are 0 cats alive!


Анализ: В строке 15 в объявлении класса Cat создается закрытая статическая переменная-член HowManyCats. В строке 12 объявляется открытая статическая функция-член GetHowMany.

Так как функция GetHowMany открыта, доступ к ней может получить любая другая функция, а при объявлении ее статической отпадает необходимость в существовании объекта типа Cat. Именно поэтому функция TelepathicFunction в строке 42 может получить доступ к GetHowMany, не имея доступа к объекту Cat. Конечно же, к функции GetHowMany можно было обратиться из блока main так же, как к обычным методам объектов Cat.


Примечание: Статические функции-члены не содержат указателя this. Поэтому они не могут объявляться со спецификатором const. Кроме того, поскольку функции-члены получают доступ к переменным-членам с помощью указателя this, статические функции-члены не могут использовать обычные нестатические переменные-члены!


Статические функции-члены

Доступ к статическим функциям-членам можно получить, либо вызывая их из объектов класса как обычные функции-члены, либо вызывая их без объектов, явно указав в этом случае имя класса. Пример:

class Cat

{

   public:

      static int GetHowMany { return HowManyCats; }

   private:

      static int HowManyCats;

}

int Cat::HowManyCats = 0;

int main

{

   int howMany;

   Cat theCat; // определение обьекта

   howMany = theCat.GetHowMany; // доступ через объект

   howMany = Cat::GetHowMany; // доступ без объекта

}

Указатели на функции

Перейти на страницу:

Похожие книги

Сущность технологии СОМ. Библиотека программиста
Сущность технологии СОМ. Библиотека программиста

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Дональд Бокс

Программирование, программы, базы данных / Программирование / Книги по IT