Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мини конспект по С++.doc
Скачиваний:
28
Добавлен:
25.03.2015
Размер:
782.85 Кб
Скачать

Вызов функции.

Вызов функции имеет следующий формат:

<имя_функции>(список_аргументов)

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

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

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

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

Изменение значений параметров.

В языке С/С++ аргументы при стандартном вызове функции передаются по значению, т.е. в функцию передаются не оригиналы аргументов, а их копии. В стеке выделяется место для формальных параметров функции и в это выделенное место при ее вызове заносятся значения фактических аргументов. Затем функция использует и может изменять эти значения в стеке. Но при выходе из функции измененные значения теряются. Вызванная функция не может изменить значения переменных, указанных как фактические аргументы при обращении к данной функции.

Рис. 1. C++ размещает копии значений параметров во временном участке

памяти, называемом стеком

В случае необходимости функцию можно использовать для изменения передаваемых ей аргументов. В этом случае в качестве аргумента необходимо в вызываемую функцию передавать не значение переменной, а ее адрес. А для обращения к значению аргумента-оригинала использовать операцию «*».

Рис. 2. Передача параметров по адресу.

Пример функции, в которой меняются местами значения аргументов xиy:

void zam (int *x, int *y)

{

int t;

t = *x;

*x = y; *y = t;

}

Участок программы с обращением к данной функции:

void zam (int*, int*);

void main (void)

{

int a=2, b=3; …

cout<<" a = "<< a << " b = "<< b;

zam (&a, &b);

cout<<" a = "<< a << " b = "<< b;

}

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

a = 2 , b=3

a = 3 , b=2

Область действия переменных

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

  • внутри функции- локальные (внутренние) переменные;

  • при определении параметров функции- формальные параметры;

  • вне функции - глобальные (внешние) переменные.

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

. . .

int n; // глобальное n

void main (void)

{

int i;

...

f1(i);

...

f2(n); // локальное n

}

f1(int i)

{

...

i=n; // глобальное n

...

}

f2(int n)

{

int i;

...

i=n; // локальное n

...

}

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

...

void main(void)

{

int i = 3;

cout << “\n Block 1 - “ << i ;

{

float i = 2.5;

cout << “\n Block 2 - “ << i ;

{

char i = ‘a’;

cout << “\n Block 3 - “ << i ;

}

}

cout << “\n New Block 1 - “ << ++i ;

}

В результате выполнения этой программы на экране получим:

Block 1 - 3

Block 2 - 2.5

Block 3 - a

New Block 1 - 4