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

Объявление (прототип) функции

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

Синтаксис: [спецификатор][тип][соглашение по вызову]имя функции([список аргументов] || [void]);

Самое короткое описание функции:

z();

Тип

Тип задает тип возвращаемого функцией значения. Если поле отсутствует, то компилятор считает, что функция возвращает тип int. Если функция возвращает ключевое слово void, то функции не возвращает никакого значения

спецификаторы: static

соглашение по вызову (extern)

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

Правило об объявлении функции: начало слов большими буквами, остальное маленькими, название должно передавать суть функции (SortBubble).

Список аргументов определяет количество и тип аргументов (параметров), передаваемых в функцию.

список_аргументов==тип_аргумента1 [имя_аргумента], тип_аргумента2 [имя_аргумента]

Замечание. В прототипе функции важны типы параметров, а не их имена. Компилятор игнорирует имена. Ели в функцию не передаются никакие аргументы, это поле оставляется пустым или содержит ключевое слово void.

Объявление inline-функции.

Можно объявить функцию со спецификатором inline.

inline char *F();

Определение

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

double sum (double a, double b);

{

double s;

s=a+b;

return s;

}

main()

{

L=sum(2, 5.4)

}

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

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

- связь по управлению (вызов→возврат)(сохранение и восстановление контекста вызывающей части)

- связь по данным (функция должна производить одни и те же действия с разными наборами данных)

Вызывающая часть

Стек

Функция sum

int a=1;

int b=5;

i nt sum=sum(a,b);

1) Формирование параметров в стеке 2) Сохранение адреса возврата и передачи управления(вызов)

3 ) Восстановление стека

4) Получение результата

Локальная переменная.

Адрес возврата

1

5

1) Сохранение контекста вызова

2) Создание текущего контекста

3) Тело функции

int s=x+y;

4) Формирование возвращаемого значения

return s;

5) Восстановление

6) Возврат контекста вызова

В разных языках программирования параметры в стеке могут следовать в разном порядке. Пример: С и Basic

Вызов inline – функции

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

  1. (+) исключаются «накладные расходы» для функции

  2. (+) сохраняется структурированность текста программы

  3. (-) обычно увеличивается объем программы

Решение о подстановке тела функции в текст принимает компилятор.

Функции не будут встраиваться в следующем случае:

  1. Рекурсивные функции

  2. Функции, вызов которых осуществляется посредством указателя

  3. Функции с переменным числом параметров

inline int sum (int x, int y)

{

return(x+y);

}

main()

{

int z=sum(x,y);

}

С пособы передачи параметров

По значению

По адресу

по указателю

по ссылке

Передача параметров по значению

Это простая передача копий переменных в стеке, не оставляющая никаких возможностей для изменения переменных, вызывающих функции.

sum (int a, int b)

{

return(a+b);

}

main()

{

int c=sum(2, 5.8);

int a=4, b=8;

int d=sum(a,b);

}

Передача параметров по адресу

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

Различают 2 вида передачи адреса:

  1. По ссылке

  2. По указателю

Передача параметров с помощью указателя

Указатель используется для получения из функции доступа к массивам и другим большим объектам

Передача по ссылке

Передается ссылка (замаскированный адрес). Позволяет использовать ссылку как сам объект.

void fPointer(int x, int y)

int *sum;

int *sub;

{

*sum=x+y;

*sub=x-y;

}

main()

{

int a=2, b=1, r1, r2;

fPointer(a,b,&r1,&r2)

}

void fReferance(int x, int y)

int ∑

int ⊂

{

sum=x+y;

sub=x-y;

}

main()

{

int a=2, b=1, r1, r2;

fReference(a,b,r1,r2);

}

Замечание: Если при передаче адреса требуется запретить функции модифицировать значение по этому адресу, следует использовать ключевое слово const.

void f (const tint &r)

{

r++ //ошибка компилятора.

}

Язык С позволяет использовать достаточно сложные выражения

void f (int x);

int main()

{

int x=1;

int *p=&x;

f(p);

}

f(&x);