Статические функции-члены
Статические функции-члены подобны статическим переменным-членам: они не принадлежат одному объекту, а находятся в области видимости всего класса. Именно поэтому их можно вызывать даже в тех случаях, когда не было создано ни одного объекта класса, как показано в листинге 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; // доступ без объекта
}
Указатели на функции