Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ Программирование и основы алгоритмизации...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.5 Mб
Скачать

Параметры функции

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

При вызове функции:

1) вычисляются выражения (если они есть), стоящие на месте фактических параметров;

2) в стеке выделяется память под формальные параметры в соответствии с их типами;

3) каждому их них присваивается значение соответствующего фактического параметра. Проверяется соответствие типов и при необходимости выполняется допустимое их преобразование. При несоответствии типов выдается диагностическое сообщение.

Существуют два способа передачи параметров вызывающей функции в вызываемую функцию: 1)по значению, 2)по адресу.

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

При передаче по адресу в стек заносятся копии адресов фактических параметров. Функция имеет доступ к фактическим параметрам по их адресам и может изменять значения фактических параметров.

По выходу из функции копии значений и копии адресов фактических параметров теряются. Рассмотрим пример.

#include <iostream.h>

void f(int a, int* b, int& c);

void main()

{ int i=1, j=2, k=3;

cout<<”i j k\n”;

cout<<i<<’ ‘<<j<<’ ‘<<k<<’\n’;

f(i, &j, k);

cout<<i<<’ ‘<<j<<’ ‘<<k<<’\n’;

}

void f(int a, int* b, int& c)

{a++; (*b)++; c++;}

Результат:

i j k

1 2 3

1 3 4

Первый параметр (i) передается по значению. Его изменение в функции не влияет на исходное значение.

Второй параметр (j) передается по адресу с помощью указателя. Для действий используются операции взятия адреса и разыменовывания.

Третий параметр (k) передается по адресу с помощью ссылки. Операции взятия адреса и разыменовывания выполняются неявно. Поэтому передача по ссылке удобнее.

Примечания. 1)При передаче данных большого объёма используют ссылки, так как при этом не требуется копирование, т.е. не требуется больших накладных расходов.

2)Исходные данные, которые не должны изменяться, передаются в функцию с помощью константных ссылок, например:

int f(………., const int&);

Встроенные функции

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

inline float cube(const float s){return s*s*s;}

Модификатор inline рекомендует компилятору в место обращения к функции помещать её код непосредственно в каждую точку вызова. При этом снижаются накладные расходы на вызов (сохранение и восстановление регистров, передача управления).

Функции с параметрами со значениями по умолчанию

Чтобы упростить вызов функции, в её заголовке указывают значения параметров по умолчанию. В качестве значений могут использоваться константы, глобальные переменные и выражения.

int box(int l=1, int w=1, int h=1)

{return l*w*h;}

//--------------------------------------

void main()

{ cout<<box()<<endl //1*1*1

<<box(10)<<endl //10*1*1

<<box(10,5)<<endl //10*5*1

<<box(10,5,2)<<endl //10*5*2

<<box( , , 2)<<endl; //1*1*1

}