}
void main (void)
{
cout<<endl<<"vvedite a, x1, x2 ";
float x1, a, x2;
cin>>a>>x1>>x2;
float vir1;
countX (x1*x1, x2,pi, M_PI_2);
float vir2;
countX(x2, x1 + 1.2, 0, vir2);
float x=1/11. + a * vir1 + 1 / vir2;
cout<< endl <<"X = "<<x;
getch();
}
Пояснения к работе программы в этом варианте.
Программа начинает работать с функции main.
Попрежнему первая исполняемая инструкция-выражение
сout << endl << "vvedite a, x1, x2 ";
выводит на экран подсказку.
Следующая инструкция-выражение вводит информацию с клавиатуры в три объекта a, x1, x2. Пользователь ввел a равное 1, x1 равное 2, x2 равное 3.
В инструкции-выражении
countX (x1*x1, x2, M_PI_2, vir1);
выполняется оператор () вызова функции, где четвертым параметром, получаемым по ссылке на float,указан объект vir1.
При вызове функции countX эта функция принимает первый фактический параметр по значению (получает результат вычисления выражения x1*x1, равное 4) и для хранения этого значения 4 в объекте–функции countX создается локальный объект с именем а, тип которого float (т.к. первый формальный параметр в списке формальных параметров функции float a). Полученное через параметр значение 4 записывается в этот локальный объект а. Так же передаются остальные два фактических параметра – значения 3 из объекта x2 и 1.57 из константы M_PI_2. Для записи этих значений создаются локальные объекты b и c. Здесь механизм тот, который уже был расмотрен. Значения, записанные в локальные объекты а, b и c используются при вычислении значения выражения (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b), а полученный результат, равный 0.02, записывается в объект, имя которого х. А имя х при этом первом вызове функции именует объект vir1, так как в списке формальных параметров при вызове была сделана инициализация 4 параметра:
float& x = vir1, то есть имя х в этой фукции назначено новым именем объекта vir1.
Этот объект определен в функции main, следовательно информация вычисленная в функции countX инструкцией
x = (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b);
ее оператором присвоить записывается в объект с именем х, которое именует объект vir1. Информация из области функции countX попадает в область другой функции- функции main.
При втором вызове функции countX в инструкции-выражении
countX(x2, x1 + 1.2, 0, vir2);
выполняется оператор () вызова функции countX, где четвертым параметром, получаемым по ссылке на float,указан объект vir2.
Значения, полученные в локальные объекты а, b и c при этои вызове используются при вычислении значения выражения (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b), а полученный результат, равный теперь -0.09, записывается в объект, имя которого в этой функции попрежнему х. А это имя при этом новом вызове функции именует объект vir2, так как в списке формальных параметров при этом вызове была сделана инициализация 4 параметра:
float& x = vir2, то есть имя х в этой фукции будет новым именем объекта vir2.
Этот объект попрежнему определен в функции main. Таким образом информация вычисляется функцией countX винструкции
x = (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b);
Оператором присвоить эта инструкция записывает результат в область памяти другой функции, в область памяти объекта vir2 .
(Технически такой механизм передачи объекта по ссылке использует все тот же механизм передачи через параметры по значению адреса передаваемого объекта, например, vir1. Но к полученному по значению адресу объекта vir1, автоматически применяется оператор взятия объекта и таким образом, обеспечивается работа не с переданным адресом объекта, а с самим объектом, определенным в другой функции).
По ссылке можно передать объект, тип которого обязательно должен совпадать с типом, на который сделана ссылка.
Файл example3.cpp
Define _USE_MATH_DEFINES
#include <math.h>
void countX (float a, float b, float c, float& x)
{
x= (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b);
}
void main (void)
{
cout<<endl<<"vvedite a, x1, x2 ";
float x1, a;