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

Основные теоретические положения

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

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

Программа на языке С++ состоит, как правило, из одной или нескольких функций. Выполнение программы начинается с функции main(). Вызов функции осуществляется при выполнении программы тогда, когда встречается имя функции. Управление передается функции для решения конкретной задачи и затем возвращается в вызывающее окружение (calling environment).

Например:

main()

{ - - -

- - -

y = sin(x); //вызов стандартной функции из math.h

a = my_function(b); //вызов функции пользователя

ptintf («Эта процедура»); //вызов стандартной функции-процедуры из stdio.h

- - -

- - -

}

  1. Определение функции

Определение функции (function definition) – это код, реализующий то, что выполняет функция:

возвращаемый_тип имя_функции (список _объявлений _формальных _ параметров) //заголовок функции

{

операторы_тела_функции

}

Здесь возвращаемый_тип – это тип значения, возвращаемого функцией; имя_функции – идентификатор;

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

операторы_тела_функции – перечень операторов, заключенных в фигурные скобки.

Например: int my_function (int p)

{return (-p);} //функция смены знака целого аргумента

  1. Механизм возврата значений

Для возврата значения в теле функции необходимо использовать оператор

return выражение;

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

Использование return без выражения приведет к немедленной передаче управления программой в вызывающее окружение.

Например: return;

return 5;

return (5+x); //скобки не обязательны

  1. Механизм передачи параметров

В языке С++ параметры могут передаваться функции по значению и по ссылке. При передаче параметров по значению (call-by-value) последние передаются функции как аргументы, их значения копируются в соответствующие формальные параметры функции, при этом фактические параметры не могут быть изменены в вызывающем окружении. При передаче параметров по ссылке (call-by-reference) их адреса передаются функции как аргументы, сами параметры могут изменяться в вызывающем окружении. В списке объявлений формальных параметров используются указатели для хранения адресов фактических параметров. В теле функции указатели необходимо разыменовывать. Для передачи параметров по ссылке также применяются объявления ссылок, которые передаются функции как аргументы.

Например:

определение функции / вызов функции

void swap (int i, int j) swap(a, b);

{int t = i; i = j; j = t;} a и b значениями не поменяются

void swap (int *i, int *j) swap(&a, &b);

{int t = *i; *i = *j; *j = t;} a и b поменяются значениями

void swap (int &i, int &j) swap(a, b);

{int t = i; i = j; j = t;} a и b поменяются значениями

  1. Прототипы функций

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

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

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

Примеры прототипов: void swap(int&, int&);

int my_function(int p);

  1. Аргументы по умолчанию

Формальным параметрам могут быть заданы аргументы по умолчанию (default argument), значения которых, как правило, наиболее часто встречаются при вызове функции. Значения по умолчанию могут иметь только несколько последних формальных параметров, соответствующие им фактические параметры при вызове функции не пишутся.

Например: определение функции

int my_function (int i, int j = 2, int k = 3)

{ return i + j + k;} // по умолчанию j = 2, k = 3

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

y = my_function (1); // вычислит: 1 + 2 + 3

y = my_function (10, 20, 30); // вычислит: 10 + 20 + 30

  1. Встраивание функций

Для компиляции функции во встроенный код используется директива inline. Встраивание применяется для коротких несложных функций с целью повышения эффективности разработки программ:

inline float cube(float x) // имеет внутреннюю

{return x*x*x;} // компоновку

  1. Перегрузка функций

Перегрузка (overloading) – это применение одного имени для нескольких вариантов функции, выбор конкретного варианта определяется сигнатурой параметров:

float cube(float x) // y = cube(1.5);

{ - - - - - }

int cube(int x) // z = cube(15);

{ - - - - - }

  1. Область видимости и классы памяти

Класс памяти определяет место хранения, область видимости и время существования объекта. Существует четыре класса памяти: автоматический, регистровый, внешний и статистический. Они задаются следующими модификаторами: auto, register, extern, static.

Область видимости (scope) может быть локальной, в пределах файла, пространства имен и класса. Правило области видимости определяет доступность объектов только в пределах области видимости (внутри блока), в которой они объявлены. Область видимости имеет присущую только ей номенклатуру объявлений.