- •ФУНКЦИИ ИСПОЛЬЗУЮТСЯ ДЛЯ НАВЕДЕНИЯ ПОРЯДКА В ХАОСЕ АЛГОРИТМОВ.
- •ФУНКЦИИ
- •Функция — это именованная
- •Объявление и определение функций.
- •ОБЪЯВЛЕНИЕ И ОПРЕДЕЛЕНИЕ ФУНКЦИЙ.
- •Объявление функции
- •[класс] тип имя ([список_параметров]) [throw(исключения)] {тело функции}
- •[класс] тип имя ([список_параметров]) [throw(исключения)] {тело функции}
- •[класс] тип имя ([список_параметров]) [throw(исключения)] {тело функции}
- •[класс] тип имя ([список_параметров]) [throw(исключения)] {тело функции}
- •Функцию можно определить как встроенную с помощью модификатора inline.
- •ОБЪЯВЛЕНИЕ И ОПРЕДЕЛЕНИЕ ФУНКЦИЙ.
- •Значения локальных переменных между вызовами одной и той же функции не сохраняются.
- •Механизм возврата из функции в вызвавшую ее функцию реализуется оператором
- •ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ.
- •Примеры:
- •Параметры
- •При вызове функции:
- •Существует два способа передачи параметров в функцию:
- •ПАРАМЕТРЫ ФУНКЦИИ.
- •Пример:
- •По умолчанию параметры любого типа,
- •ПЕРЕДАЧА МАССИВОВ В КАЧЕСТВЕ ПАРАМЕТРОВ.
- •ПЕРЕДАЧА МНОГОМЕРНЫХ МАССИВОВ В КАЧЕСТВЕ ПАРАМЕТРОВ.
- •Функцию можно вызвать через указатель на нее.
- •void f(int a ){/*...*/ } // определение функции
- •ПЕРЕДАЧА ИМЕН ФУНКЦИЙ В КАЧЕСТВЕ ПАРАМЕТРОВ.
- •Чтобы упростить вызов функции, в ее заголовке можно указать значения параметров по умолчанию
- •Пример:
- •Функции с переменным числом параметров
- •ФУНКЦИИ С ПЕРЕМЕННЫМ ЧИСЛОМ ПАРАМЕТРОВ.
- •В качестве примера можно привести
- •ФУНКЦИИ С ПЕРЕМЕННЫМ ЧИСЛОМ ПАРАМЕТРОВ.
- •За правильность выбора дополнительных аргументов из
- •ФУНКЦИИ С ПЕРЕМЕННЫМ ЧИСЛОМ ПАРАМЕТРОВ.
- •Функции с переменным числом параметров 41
- •МАКРОКОМАНДА VA_START.
- •Функции с переменным числом параметров 43
- •МАКРОКОМАНДА VA_ARG.
- •Функции с переменным числом параметров 45
- •ПРИМЕР ФУНКЦИИ С ПЕРЕМЕННЫМ ЧИСЛОМ ПАРАМЕТРОВ.
- •ЗАМЕЧАНИЯ К ПРИМЕРУ.
- •Поскольку компилятор не имеет информации для контроля типов, вместо функций с переменным
- •Рекурсивные
- •РЕКУРСИВНЫЕ ФУНКЦИИ.
- •Пример:
- •РЕКУРСИВНЫЕ ФУНКЦИИ.
Функцию можно определить как встроенную с помощью модификатора inline.
компилятор вместо обращения к функции помещает ее код непосредственно в каждую точку вызова
11
ОБЪЯВЛЕНИЕ И ОПРЕДЕЛЕНИЕ ФУНКЦИЙ.
Директива inline носит рекомендательный характер и выполняется компилятором по мере возможности.
Использование inlineфункций может увеличить объем исполняемой программы.
Определение inlineфункции должно предшествовать ее вызовам
•иначе вместо inlineрасширения компилятор сгенерирует обычный вызов.
12
#include <iostream.h> |
|
int sum(int a, int b); |
// объявление функции |
int main(){ |
|
int a = 2, b = 3, с, d;
с = sum(a, b); // вызов функции
cin >> d; |
|
cout << sum(c, d); |
// вызов функции |
return 0; |
|
}
int sum(int a, int b){ // определение функции return (a + b);
}
Пример функции, возвращающей сумму двух целых величин 13
#include <iostream.h> |
|
struct Worker{ |
|
char fio[30]; |
|
int date, code; |
|
double salary; |
|
}; |
|
void print_worker(Worker); |
//объявление функции |
int main(){ |
|
Worker staff[100]; |
|
. . .
/* формирование массива staff */.
for (int i = 0; i<100; i++)print_worker(staff[i]);
// вызов функции return 0; |
|
} |
|
void print_worker(Worker w){ |
//определение функции |
cout << w.fio << ' ' << w.date << ' ' << w.code << ' ' << w.salary << endl;
}
Пример функции, выводящей на экран поля переданной ей структуры 14
Значения локальных переменных между вызовами одной и той же функции не сохраняются.
Если этого требуется избежать, при объявлении локальных переменных используется модификатор static.
15
#include <iostream.h> void f(int a){
int m = 0;
cout << "n m p\n"; while (a--){
static int n = 0; int p = 0;
cout << n++ << ' ' << m++ << ' ' << p++ <<
'\n';
}
}
int main(){ f(3); f(2); return 0;}
Программа выведет на экран:
n |
m |
p |
0 |
0 |
0 |
1 |
1 |
0 |
2 |
2 |
0 |
n |
m |
p |
3 |
0 |
0 |
4 |
1 |
0 |
Модификатор static |
16 |
Механизм возврата из функции в вызвавшую ее функцию реализуется оператором
return [ выражение ];
17
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ.
Функция может содержать несколько операторов return.
Если функция описана как void, выражение после return не указывается.
•оператор return можно опускать для функции типа void, если возврат из нее происходит перед закрывающей фигурной скобкой, и для функции.
Выражение, указанное после return, неявно преобразуется к типу возвращаемого функцией значения и передается в точку вызова функции
18
Примеры:
int fl(){return 1;} void f2(){return 1;}
//правильно
//неправильно,
/* f2 не должна возвращать значение */
double f3(){return 1;} // правильно,
/* 1 преобразуется к типу double */
Нельзя возвращать из функции указатель на локальную переменную
int* f(){ int a = 5; return &a; // нельзя!
}
память, выделенная локальным переменным при входе в функцию,
освобождается после возврата из нее
Возвращаемое значение |
19 |
Параметры
функции
•Механизм параметров является основным способом обмена информацией между вызываемой и вызывающей функциями