Слайд 2Вопрос 1
Объявление и определение функций
![Вопрос 1 Объявление и определение функций](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-1.jpg)
Слайд 3Определение
Функция – это именованная последовательность описаний и операторов, выполняющая какое-либо законченное действие.
![Определение Функция – это именованная последовательность описаний и операторов, выполняющая какое-либо законченное](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-2.jpg)
Функция может принимать параметры и возвращать значение.
Слайд 4Особенности
Любая программа на С++ состоит из функций, одна из которых должна иметь
![Особенности Любая программа на С++ состоит из функций, одна из которых должна](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-3.jpg)
имя main (с нее начинается выполнение программы). Функция начинает выполняться в момент вызова.
Любая функция должна быть объявлена и определена. Как и для других величин, объявлений может быть несколько, а определение только одно.
Объявление функции должно находиться в тексте раньше ее вызова для того, чтобы компилятор мог осуществить проверку правильности вызова.
Слайд 5Структура функции
Объявление функции (прототип, заголовок, сигнатура) задает ее имя, тип возвращаемого значения
![Структура функции Объявление функции (прототип, заголовок, сигнатура) задает ее имя, тип возвращаемого](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-4.jpg)
и список передаваемых параметров.
Определение функции содержит, кроме объявления, тело функции, представляющее собой последовательность операторов и описаний в фигурных скобках:
[ класс ] тип имя ([ список параметров ])
{ тело функции }
Слайд 6Класс функции
С помощью необязательного модификатора класс можно явно задать область видимости функции,
![Класс функции С помощью необязательного модификатора класс можно явно задать область видимости](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-5.jpg)
используя ключевые слова extern и static:
extern – глобальная видимость во всех модулях программы (по умолчанию);
static – видимость только в пределах модуля, в котором определена функция.
Слайд 7Тип возвращаемого значения
Тип возвращаемого функцией значения может быть любым, кроме массива и
![Тип возвращаемого значения Тип возвращаемого функцией значения может быть любым, кроме массива](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-6.jpg)
функции (но может быть указателем на массив или функцию). Если функция не должна возвращать значение, указывается тип void.
Слайд 8Параметры функции
Список параметров определяет величины, которые требуется передать в функцию при ее
![Параметры функции Список параметров определяет величины, которые требуется передать в функцию при](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-7.jpg)
вызове.
Элементы списка параметров разделяются запятыми.
Для каждого параметра, передаваемого в функцию, указывается его тип и имя.
Слайд 9Параметры функции
В определении, в объявлении и при вызове одной и той же
![Параметры функции В определении, в объявлении и при вызове одной и той](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-8.jpg)
функции типы и порядок следования параметров должны совпадать.
На имена параметров ограничений по соответствию не накладывается, поскольку функцию можно вызывать с различными аргументами.
Слайд 10Вызов функции
Для вызова функции в простейшем случае нужно указать ее имя, за
![Вызов функции Для вызова функции в простейшем случае нужно указать ее имя,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-9.jpg)
которым в круглых скобках через запятую перечисляются имена передаваемых аргументов.
Вызов функции может находиться в любом месте программы, где по синтаксису допустимо выражение того типа, который формирует функция.
Если тип возвращаемого функцией значения не void, она может входить в состав выражений или, в частном случае, располагаться в правой части оператора присваивания.
Слайд 11Пример 1
Функция, возвращающая сумму двух целых величин:
#include
int sum(int a, int b); //
![Пример 1 Функция, возвращающая сумму двух целых величин: #include int sum(int a,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-10.jpg)
объявление функции
int main(){
int a = 2, b = 3, c, d;
с = sum(a, b); // вызов функции
cin >> d;
cout<< sum(c, d); // вызов функции
return 0;
}
int sum (int a, int b){ // определение функции
return (a + b);
}
Слайд 12Пример 2
Функция, выводящая на экран поля переданной ей структуры:
#include
struct Worker{
char fio[30];
int
![Пример 2 Функция, выводящая на экран поля переданной ей структуры: #include struct](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-11.jpg)
code;
double zarpl;
};
void print_worker(Worker); //объявление функции
int main()
{
Worker mas[10];
... /* формирование массива mas */
Слайд 13Пример 2 (продолжение)
for (int i = 0; i<10; i++)
print_worker(mas[i]); // вызов функции
return 0;
}
void
![Пример 2 (продолжение) for (int i = 0; i print_worker(mas[i]); // вызов](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-12.jpg)
print_worker(Worker w) // определение функции
{
cout<< w.fio << ' ' << w.date << ' ' << w.code
<< ' ' << w.zarpl << '\n';
}
Слайд 14Локальные параметры
Все величины, описанные внутри функции, а также ее параметры, являются локальными.
![Локальные параметры Все величины, описанные внутри функции, а также ее параметры, являются](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-13.jpg)
Областью их действия является функция.
При выходе из функции значения локальных переменных между вызовами одной и той же функции не сохраняются.
Если этого требуется избежать, при объявлении локальных переменных используется модификатор static:
static int n = 0;
Слайд 15Глобальные переменные
Глобальные переменные видны во всех функциях, где не описаны локальные переменные
![Глобальные переменные Глобальные переменные видны во всех функциях, где не описаны локальные](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-14.jpg)
с теми же именами, поэтому использовать их для передачи данных между функциями очень легко.
Тем не менее это не рекомендуется, поскольку затрудняет отладку программы и препятствует помещению функций в библиотеки общего пользования.
Нужно стремиться к тому, чтобы функции были максимально независимы, а их интерфейс полностью определялся прототипом функции.
Слайд 16Вопрос 2
Возвращаемое значение и параметры функции
![Вопрос 2 Возвращаемое значение и параметры функции](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-15.jpg)
Слайд 17Оператор return
Механизм возврата из функции в вызвавшую ее функцию реализуется оператором
return [
![Оператор return Механизм возврата из функции в вызвавшую ее функцию реализуется оператором return [ выражение ];](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-16.jpg)
выражение ];
Слайд 18Особенности
Функция может содержать несколько операторов return (это определяется потребностями алгоритма).
Если функция
![Особенности Функция может содержать несколько операторов return (это определяется потребностями алгоритма). Если](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-17.jpg)
описана как void, выражение не указывается.
Оператор return можно опускать для функции типа void, если возврат из нее происходит перед закрывающей фигурной скобкой, и для функции main.
Выражение, указанное после return, неявно преобразуется к типу возвращаемого функцией значения и передается в точку вызова функции.
Слайд 19Примеры:
int fl(){return 1;} // правильно
void f2(){return 1;} // неправильно, f2 не должна
![Примеры: int fl(){return 1;} // правильно void f2(){return 1;} // неправильно, f2](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-18.jpg)
возвращать значение
double f3(){return 1;}// правильно, 1 преобразуется к типу double
Слайд 20Параметры функции
Параметры, перечисленные в заголовке описания функции, называются формальными параметрами, или просто
![Параметры функции Параметры, перечисленные в заголовке описания функции, называются формальными параметрами, или](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-19.jpg)
параметрами, а записанные в операторе вызова функции – фактическими параметрами, или аргументами.
Слайд 21Способы передачи параметров
При передаче по значению в стек заносятся копии значений аргументов,
![Способы передачи параметров При передаче по значению в стек заносятся копии значений](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-20.jpg)
и операторы функции работают с этими копиями. Доступа к исходным значениям параметров у функции нет, а, следовательно, нет и возможности их изменить.
При передаче по адресу в стек заносятся копии адресов аргументов, а функция осуществляет доступ к ячейкам памяти по этим адресам и может изменить исходные значения аргументов.
Слайд 22Пример
#include
void f (int i, int* j, int& k);
int main(){
int i =
![Пример #include void f (int i, int* j, int& k); int main(){](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-21.jpg)
1, j = 2, k = 3;
cout << "i j k\n";
cout << i << ' ' << j << ' ' << k << '\n';
f(i, &j, k);
cout << i << ' ' << j << ' ' << k;
return 0:
}
Слайд 23Пример (продолжение)
void f(int i, int* j, int& k){
i++; (*j)++; k++;
}
Результат работы программы:
i
![Пример (продолжение) void f(int i, int* j, int& k){ i++; (*j)++; k++;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-22.jpg)
j k
1 2 3
1 3 4
Слайд 24Пример (продолжение)
Первый параметр (i) передается по значению. Его изменение в функции не
![Пример (продолжение) Первый параметр (i) передается по значению. Его изменение в функции](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1083326/slide-23.jpg)
влияет на исходное значение.
Второй параметр (j) передается по адресу с помощью указателя, при этом для передачи в функцию адреса фактического параметра используется операция взятия адреса, а для получения его значения в функции требуется операция разыменования.
Третий параметр (k) передается по адресу с помощью ссылки.