Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Konspekt_S__Chast_2.doc
Скачиваний:
31
Добавлен:
09.02.2015
Размер:
1 Mб
Скачать

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

Прототипом функции называется заголовок функции (со списком параметров), заканчивающийся символом ;. Например:

double F (int P1, double P2 );// Это прототип функцииF

double F (int P1, double P2 ) // А это сама функция F

{

return P1 * P2;

}

В прототипе функции допускается не указывать имена параметров (типы параметров должны быть указаны обязательно). Например, прототип той же функции можно записать так:

double F (int, double);// И это прототип функцииF

Назначение прототипов – это опережающее описание функции, определяющее правила вызова функции.

Обычно прототипы функций используются в заголовочных файлах.

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

void A ()

{

……

B ();

……

}

void B ()

{

……

A ();

……

}

Это пример, так называемого, “перекрестного” вызова функций (функция Авызывает функциюВ, а функцияВвызывает функциюА). В этом случае конфликт может быть разрешен с помощью использования прототипа функцииB:

void B ();

void A ()

{

……

B ();

……

}

void B ()

{

……

A ();

……

}

Теперь функция А“знает”, что представляет собой функцияВи как ее вызвать.

9.2. Структура программы. Глобальные и локальные данные (области видимости и время жизни) Структура программы

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

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

В языке C++ отсутствует понятие вложенных функций, то есть внутри определять другие функции нельзя.

Глобальные и локальные данные

В языках программирования очень большое значение имеют понятия область видимостиивремя жизниобъектов программы.

Область видимости это часть текста программы, в котором может быть использован данный объект.

Время жизни переменной - интервал выполнения программы, в течение которого программный объект существует в памяти.

Оба эти понятия тесно связаны с понятием блока программы. Блоком в программе является последовательность объявлений или операторов, заключенных в фигурные скобки {}. Существуют два типа блоков:

1) составной оператор;

2) определение функции.

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

Объекты, объявленные вне блоков, обычно называют глобальными объектами. С этой точки зрения все функции программы являются глобальными объектами. Время жизни функций – все время выполнения программы. Область видимости функций начинается с точки ее объявления (это определение самой функции или объявление ее прототипа) и заканчивается при завершении программы. Кроме функций на глобальном уровне можно определять и другие программные объекты – константы, переменные, типы данных и т.д. Их время жизни и область видимости также начинаются с точки объявления.

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

Рассмотрим пример:

int I = 10;// Глобальная переменная

…….

void F ( int a )// Параметра– локальная переменная

{

cout << I;// На экране 10 – значение глобальной переменнойI

……

if ( I )// Анализируется значение глобальной переменнойI

{

int I = 200, J = 3000;// Локальные переменные

cout << I;// На экране 200 – значение локальной переменнойI

…….

}

cout << I;// На экране 10 – значение глобальной переменнойI

cout << J;// Ошибка – переменнойJбольше не существует

……

}

При совпадении имен глобального и локального объекта локальный объект “перекрывает“ глобальный объект (в нашем примере – переменные I).

Время жизни и область видимости локальных переменных, определенных на уровне заголовка цикла for, – весь операторfor:

for ( int a = 0, b = 10; a < 20; ++ a, -- b)

{

…….

cout << a * b;

…….

}

Здесь, хотя переменные aиbопределены вне блока, их можно использовать внутри блока тела цикла.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]