Программирование >>  Дополнительные возможности наследования 

1 ... 131 132 133 [ 134 ] 135 136 137 ... 265


щГ\ в строке 15 в объявлении класса Cat создается закрытая статическая пе-

.л ременная-член HowManyCats. В строке 12 объявляется открытая статическая функция-член GetHowManyO.

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


оримечание

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

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

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

class Cat

, public;

.static mt GetHowManyO { return HowManyCats; }

private: , Static int HowManyCats;

int Cat::HowManyCats = 0; int roainO

int howMany; ..Cat.theCat; определение объекта

howMany = theCat.GetHowManyO; доступ через объект howMany = Cat::GetHowMany(); доступ без объекта

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

Точно так же, как имя массива постоянно указывает на его первый элемент, имя функции является указателем на саму функцию. Можно объявить переменную-указатель функции и в дальнейщем вызывать ее с помощью этого указателя. Такая возможность может оказаться весьма полезной, поскольку позволяет создавать профаммы, в которых функции вызываются по командам пользователя, вводимым с клавиатуры.

Единственная важная деталь для определения указателя на функцию - знание типа объекта, на который ссылается указатель. Указатель типа int обязательно связан с целочисленной переменной. Аналогичным образом указатель на функцию может вызывать только функции с заданными сигнатурой и типом возврата.



в объявлении

long ( funoPtr) (int);

создается указатель на функцию funoPtr (обратите внимание на символ * перед именем указателя), которая принимает целочисленный параметр и возвращает значение типа long. Круглые скобки вокруг (* funoPtr) обязательны, поскольку скобки вокруг (int) имеют больший приоритет по сравнению с оператором косвенного обращения (*). Если убрать первые скобки, то это выражение будет объявлять функцию funcPtr, принимающую целочисленный параметр и возврашаюшую указатель на значение типа long. (Вспомните, что все пробелы в С++ игнорируются,) Рассмотрим два следующих объявления:

long Function (int); long ( funcPtr) (int);

В первой строке Function() - это функция, принимающая целочисленный параметр и возвращающая указатель на переменную типа long. Во втором примере funoPtr - это указатель на функцию, принимающую целочисленный параметр и возврашаюшую переменную типа long.

Объявление указателя на функцию всегда содержит тип возвращаемой переменной и заключенный в скобки список типов формальных параметров, если таковые имеются. Пример объявления и использования указателя на функцию показан в листинге 14.5.

йисшннг M.S. УхазашвАп на функции

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

Листинг 14.5. Использование указателей на функции

♦(include <iostream.h>

void Square (int&,int&); void Cube (int&, int&); void Swap (int&, int &); void GetVals(int&, int&); void PrintVals(int, int);

int main() {

void ( pFunc) (int &, int &); bool fOuit = false;

int valOne=l, valTwo=2; int choice;

while (fOuit == false) {

cout (O)Quit (l)Change Values (2)Square (3)Cube (4)Swap ; cin choice; switch (choice) {

case 1: pFunc = GetVals; break; case 2: pFunc = Square; break; case 3: pFunc = Cube; break; case 4: pFunc = Swap; break; default ; fQuit = true; break;



29: } 30:

31: if (fOuit) 32: break;

34: PrintVals(valOne, valTwo);

35: pFunc(valOne, valTwo);

36: PrintVals(valOne, valTwo);

37: }

38: return 0;

39: }

41: void PrintVals(int x, int y) 42: {

43: cout x: x y: у endl;

44: }

46: void Square (int & rX, int & rY) 47: {

48: rX = rX; 49: rY .= rY; 50: } 51:

52: void Cube (int & rX, int & rY) 53: {

54: int tmp; 55:

56: tmp = rX; 57: rX .= rX; 58: rX = rX . tmp; 59:

60: tmp = rY;

61: rY .= rY;

62: rY = rY tmp;

63: }

65: void Swap(int & rX, int & rY) 66: {

67: int temp; 68: temp = rX; 69: rX = rY; 70: rY = temp; 71: } 72:

73: void GetVals (int & rValOne, int & rValTwo) 74: {

75: cout New value for ValOne: ;

76: cin rValOne;

77: cout << New value for ValTwo: ;

78: cin rValTwo;

79: }



1 ... 131 132 133 [ 134 ] 135 136 137 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика