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

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


(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;



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

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