Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_УчебноеПособие.doc
Скачиваний:
44
Добавлен:
03.05.2015
Размер:
862.21 Кб
Скачать

Прототип (описание) функции. Понятие глобального объекта.

Локальные объекты определяются (создаются) в теле объекта-функции.

Локальныйобъект «живет» в этой функции, то есть может быть доступен и записанная в нем информация не будет разрушена, пока функция активна, то есть выполняются ее инструкции. Локальный объект, определенный в функции «жив», но может быть не виден в ней.

Локальныйобъект «виден» в блоке функции, то есть информация, записанная в нем, доступна для обработки, только в области памяти этой функцииот точки определения объектав инструкции его определениядо конца блока, в котором он определен. Блок задается фигурными скобками{ }.

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

Глобальный объект «жив» так долго, пока выполняется программа, в которой он определен. Область видимости глобального объекта определяется от точки его определения или описания до точки конца файла, в котором он определен или описан.

Функция, будучи объектом, определенным вне тел других функций программы, является по отношении к ним глобальным объектом. В программе, которую разработали выше, функции в файле были расположены в следующем порядке: первая функция countX, за тем функцияmain.

// В файле example1.cpp записаны функция countX, а затем main

#define _USE_MATH_DEFINES

#include <math.h>

#include <iostream>

#include <conio.h>

using namespace std;

float countX (float a, float b, float c )

{

float x;

x= (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b);

return x;

}

// --

void main ( void )

{

сout << endl << "vvedite a, x1, x2 ";

float x1, a, x2;

cin>>a>>x1>>x2;

float vir1;

vir1 = countX ( x1*x1, x2, M_PI_2); //здесь функция countX видна

float vir2;

vir2 = countX ( x2, x1 + 1.2, 0); // здесь функция countX видна

float x = 1./11 + a * vir1 + 1 / vir2;

cout << endl << "X = " << x;

getch();

}

// --

Определение функции countX состоит из заголовка функции и ее тела (показано желтым цветом).

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

Изменим последовательность расположения текстов в программе, записаном в одном файле example2.cpp. Функция countX вызывается в точке, где она не видна.

// файл example2.cpp

// Изменили порядок записи функций в файле, функция main записана первой

#define _USE_MATH_DEFINES

#include <math.h>

#include <iostream>

#include <conio.h>

using namespace std;

void main ( void )

{

сout << endl << "vvedite a, x1, x2 ";

float x1, a, x2;

cin>>a>>x1>>x2;

float vir1;

vir1 = countX ( x1*x1, x2, M_PI_2); // здесь функция countX не видна!

float vir2;

vir2 = countX ( x2, x1 + 1.2, 0); // здесь функция countX не видна!

float x = 1./11 + a * vir1 + 1 / vir2;

cout << endl << "X = " << x;

getch();

}

float countX (float a, float b, float c )

{

float x;

x= (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b);

return x;

}

// здесь функция countX видна

При попытке компиляции этого текста выдается сообщение об ошибке:

Сообщение в окне List Error

Error 2 error C3861: 'countX': identifier not found ……\пример2\example2.cpp 15

Error 3 error C3861: 'countX': identifier not found ……\пример2\example2.cpp 16

Как, не изменяя расположения функций в файле, расширить область видимости функции countX?

Необходимо вспомнить, что глобальный объект виден от точки его определения или от точки его описания до точки конца файла, в котором этот объект определен или описан.

Описание функции (прототип функции) – это точная копия заголовка функции,после которого стоит точка с запятой(ведь это инструкция!):

float countX (float a, float b, float c );

Добавим прототип функции (инструкцию описания объекта-функции) перед функцией main, в которой необходимо использовать объект, а следовательно его видеть.

// файл example2.cpp

// Изменили порядок записи функций в файле, функция main записана первой

#define _USE_MATH_DEFINES

#include <math.h>

#include <iostream>

#include <conio.h>

using namespace std;

float countX (float a, float b, float c );

void main ( void )

{

сout << endl << "vvedite a, x1, x2 ";

float x1, a, x2;

cin>>a>>x1>>x2;

float vir1;

vir1 = countX ( x1*x1, x2, M_PI_2); // здесь функция countX стала видна!

float vir2;

vir2 = countX( x2, x1 + 1.2, 0); // здесь функция countX стала видна!

float x = 1./11 + a * vir1 + 1 / vir2;

cout << endl << "X = " << x;

getch();

}

// здесь функция countX видна

float countX (float a, float b, float c )

{

float x;

x= (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b);

return x;

}

// здесь функция countX видна

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

float countX (float, float, float );

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

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