- •Федеральное агентство связи
- •Базовые стандартные типы данных
- •Определение объекта типа функции.
- •Проблема обмена информацией (данными) между функциями.
- •Передача информации в функцию через параметры по значению. Возврат значения одного результата из функции через возвращаемое значение.
- •Прототип (описание) функции. Понятие глобального объекта.
- •Передача параметров по ссылке.
- •Обмен данными между функциями через глобальные объекты.Функции без возвращаемого значения. Функции без параметров.
- •Смешанный обмен данными между функциями
- •Программы, состоящие из двух и более файлов.
- •Void countX (float c, float& X); // описанa функция countX для расширения ее // области видимости. Ее определение
- •Приложение 1
Прототип (описание) функции. Понятие глобального объекта.
Локальные объекты определяются (создаются) в теле объекта-функции.
Локальныйобъект «живет» в этой функции, то есть может быть доступен и записанная в нем информация не будет разрушена, пока функция активна, то есть выполняются ее инструкции. Локальный объект, определенный в функции «жив», но может быть не виден в ней.
Локальныйобъект «виден» в блоке функции, то есть информация, записанная в нем, доступна для обработки, только в области памяти этой функцииот точки определения объектав инструкции его определениядо конца блока, в котором он определен. Блок задается фигурными скобками{ }.
Объект может быть определен вне тела функции. Объект, созданный вне функции, называется глобальным объектом. Поведение такого объекта не такое, как поведение локального объекта.
Глобальный объект «жив» так долго, пока выполняется программа, в которой он определен. Область видимости глобального объекта определяется от точки его определения или описания до точки конца файла, в котором он определен или описан.
Функция, будучи объектом, определенным вне тел других функций программы, является по отношении к ним глобальным объектом. В программе, которую разработали выше, функции в файле были расположены в следующем порядке: первая функция 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 );
Эта возможность вытекает из того, что при вызове функции контролируется соответствие фактических параметров в списке вызова этой функции списку формальных параметров в заголовке функции или в ее прототипе. Контроль осуществляется на соответствие типа параметров и их количества.
Указание имен в списке формальных параметров прототипа функции ничего не уточняет для правильности ее вызова, но знание этих имен бывает удобно для пользователя при формировании этого списка вызова.