Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
84
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

8.4.2. Использование аппарата формальных и фактических параметров

Формальные параметры – это переменные, которые объявляются в заголовке функции при ее определении. Список формальных параметров определяет: количество данных, которое должна получить или вернуть функция, типы этих данных и порядок следования данных. Фактические параметры (аргументы) функции указываются в круглых скобках при вызове функции после ее имени. Они задают конкретные данные, которые передаются в вызываемую функцию, или переменные, в которые вызываемая функция передает результаты своей работы.

В С++ существуют два способа передачи параметров в функцию:

  • по значению;

  • по ссылке.

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

Синтаксис формального параметра-значения:

тип имя_параметра

Пример прототипа функции с формальным параметром-значением:

float f (int x);

Способ передачи параметров по значению требует дополнительного пространства для формальных параметров, размеры которых должны быть равными размерам соответствующих факфактических параметров, и в случае большого размера входных данных требует больших временных расходов на копирование аргументов в формальные параметры.

При передаче параметров функции по ссылке в формальный параметр функции передается не копия значения фактического параметра, а его адрес. Термин «ссылка» означает ссылку на область памяти. Функция, работая с формальным параметром, обращается по указанному в формальном параметре адресу и изменяет значение фактического параметра. Таким образом, формальные параметры-ссылки могут использоваться для получения из функции выходных данных (результатов работы функции).

Для реализации передачи по ссылке используются два способа:

  • связь через формальный параметр-указатель;

  • связь через ссылочный формальный параметр.

Пример программы вычисления суммы и разности двух целых чисел, в которой используется передача выходных данных функции через указатели:

#include <conio.h>

#include <iostream.h>

void sumraz(int a, int b, int *s, int *r) //s сумма a и b, r - разность

{

*s=a+b;

*r=a-b;

}

void main()

{

int x, y, sum, raz;

cout<<"x,y? "; cin>>x>>y;

sumraz(x,y,&sum, &raz); //вызов функции

cout<<sum<<’ ‘<<raz;

getch();

}

При вызове функции sumraz в формальные параметры-указатели s и r передаются адреса переменных sum и raz: &sum и &raz. Функция sumraz с помощью операций разыменования (косвенной адресации) *s и *r изменяет значения, которые находятся по полученным параметрами s и r адресам.

Пример программы вычисления суммы и разности двух целых чисел, в которой используется передача выходных данных функции через параметры-ссылки:

#include <conio.h>

#include <iostream.h>

void sumraz(int a, int b, int &s, int& r)

{

s=a+b;

r=a-b;

}

void main()

{

int x, y, sum, raz;

cout<<"x,y "; cin>>x>>y;

sumraz(x,y,sum,raz); //вызов функции

cout<<sum<<’ ‘<<raz;

getch(); }

При использовании ссылочных параметров &s и &r компилятор автоматически трактует имена формальных параметров как адреса аргументов. Все действия с параметром-ссылкой в теле функции происходят в действительности с переменной, которая является аргументом функции. Таким образом, параметр-ссылка автоматизирует механизм связи параметров по ссылке. Синтаксис становится проще и, следовательно, в программе будет меньше ошибок.

Передавать по ссылке можно не только выходные данные функции, но и входные. Например, функция sumraz может быть такой:

void sumraz(int & a, in& b, int &s, int& r)

{s=a+b; r=a-b;}

При использовании способа передачи параметров по ссылке аргументы функции не могут быть выражениями – они могут быть только переменными. Это связано с тем, что значением ссылочной переменной может быть только адрес другой переменной. Например, нельзя для последнего варианта функции использовать ее вызов в виде: sumraz(5,4,sum,raz);

Использовать входные ссылочные параметры целесообразно для больших по размеру данных, например, структур. В этом случае экономится память и время на копирование данных. Однако при использовании ссылочных параметров для входных данных возникает опасность непреднамеренного изменения входных аргументов функции внутри функции – снижается надежность программы. Для того чтобы защитить программу от подобных ошибок, входные ссылочные формальные параметры следует объявлять как константные:

сonst тип& имя_параметра

Заголовок функции sumraz с входными константными ссылочными параметрами:

void sumraz(const int &a, const int &b, int &s, int& r)

В случае константных ссылочных параметров компилятор при обнаружении в функции операторов, изменяющих константные формальные параметры функции, выдает сообщение об ошибке – ошибка в коде обнаруживается до выполнения программы.