![]() |
|
Программирование >> Дополнительные возможности наследования
щГ\ в строке 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: }
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |