|
Программирование >> Дополнительные возможности наследования
(O)Quit (l)Change Values (2)Square (3)Cube (4)Swap: 1 x: 1 y: 2 New value for ValOne: 2 New value for ValTwo: 3 x: 2 y: 3 (O)Quit (l)Change Values (2)Square (3)Cube (4)Swap: 3 x: 2 y: 3 x: 8 y: 27 (O)Quit (l)Change Values (2)Square (3)Cube (4)Swap: 2 x: 8 y: 27 x: 64 y: 729 (O)Quit (l)Change Values (2)Square (3)Cube (4)Swap: 4 x: 64 y: 729 x: 729 y: 64 (O)Quit (l)Change Values (2)Square (3)Cube (4)Swap: 0 В строках 5-8 объявляются четыре функции с одинаковыми типами возврата и сигнатурами. Все эти функции возвращают void и принимают ссылки на значения типа int. В строке 13 переменная pFunc объявлена как указатель на функцию, принимающую две ссылки на int и возвращающую void. Этот указатель может ссылаться на каждую из упоминавщихся ранее функций. Пользователю предлагается выбрать функцию, после чего она связывается с указателем pFunc. В строках 34-36 выводятся текущие значения двух целочисленных переменных, вызывается текущая функция и выводятся результаты вычислений. Указатель на функцию Обращение к функции через указатель записывается так же, как и обычный вызов функции, на которую он указывает. Просто вместо имени функции используется имя указателя на эту функцию. Чтобы связать указатель на функцию с определенной функцией, нужно просто присвоить ему имя функции без каких-либо скобок. Имя функции, как вы уже знаете, представляет собой константный указатель на саму функцию. Поэтому указатель на функцию используется так же, как и ее имя. При вызове функции через указатель следует задать все параметры, установленные для текущей функции. Пример: long(*pFuncOne) (int,int); long SomeFunction (int,int); pFuncOne = SomeFunction; pFuncOne (5,7); Зачем нужны указатели на функции В программе, показанной в листинге 14.5, можно бьшо бы обойтись и без указателей на функции, однако с их помощью значительно упрощается и становится читабельнее код программы: достаточно только выбрать функцию из списка и затем вызвать ее. В листинге 14.6 используются прототипы и объявления функций листинга 14.5, но отсутствуют указатели на функции. Оцените различия между этими двумя листингами. AucffluiiB 14.B. ВидвизмвивииыО ввривнш исшииаа 14.5 Оаз испожьзоввпип указншадаО на фуикции 1: Листинг 14.6, Видоизмененный вариант листинга 14,5 без использования указателей на функции 2 3 4 5 6 7 ftinclude <iostream,h> void Square (lnt&,lnt&); void Cube (lnt&, int&); void Swap (int&, int &); void GetVals(int&, int&); void PrintVals(int, int); int mainO { bool fQuit = false; int val0ne=1, valTwo=2; int choice; while (fQuit == false) { cout (O)Quit (l)Change Values (2)Square (3)Cube (4)Swap cin choice; switch (choice) { case 1: PrintVals(valOne, valTwo); GetVals(valOne, valTwo); PrintVals(valOne, valTwo); break; case 2; PrintVals(valOne, valTwo); Square(valOne,valTwo); PrintVals(valOne, valTwo); break; case 3: PrintVals(valOne, valTwo); Cube(valOne, valTwo); PrintVals(valOne, valTwo); break; case 4; PrintVals(valOne, valTwo); Swap(valOne, valTwo); PrintVals(valOne, valTwo); break; default : 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 fQuit = true; break; if (fOuit) break; return 0; > void PrintVals(int x, int y) { cout x: X y: у endl; void Square (int & rX, int & rY) { rX = rX; rY *= rY; void Cube (int & rX, int & rY) { int tmp; tmp = rX; rX .= rX; rX = rX tmp; tmp = rY; rY *= rY; rY = rY . tmp; > void Swapdnt & rX, int & rY) { int temp; temp = rX; rX = rY; rY = temp; > void GetVals (int & rValOne, int & rValTwo) { cout New value for ValOne; ; cin rValOne; cout New value for ValTwo: ; cin rValTwo;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |