Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Передача параметров по ссылке




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

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

Define _USE_MATH_DEFINES

Здесь функция 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 записана первой

#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();

}

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;

}

 

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

float countX (float, float, float);

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

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

 

 

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

А если результатов работы вызываемой функции больше чем одно?

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

Что же это за параметры? Для этого изучим новый производный тип – ссылка на тип

 

 

 

Имя типа «ссылка на тип» составляется из имени_типа и символа '&', например:

int& float& char&

Говорят «ссылка на int», «ссылка на float», «ссылка на char».

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

Сначала всегда определяется объект нужного типа и только после этого можно создать ссылку на этот же тип (ссылка не может изменить тип именуемого объекта) и инициализировать его именем объекта, которому ссылка задает второе имя. Ссылка всегда должна быть инициализирована!

Создадим следующие объекты инструкциями их определения:

int a = 3, b = 4;

float f;

char s1,s2;

Объектам a, f, и s2 определены (даны) новые имена в следующих инструкциях:

int& aNew = a;

float& F = f;

char& ss2 = s2;

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

aNew = b; f = 1.77; F = f - 1; ss2 = ‘w‘; s1 = s2;

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

 

 

Рассмотрим задачу – пример 2, сделав другую реализацию уже рассмотренной задачи.

 

Составить функцию countX, которая, получив а, b и с через параметры по значению, вычисляет х и возвращает результат его вычисления через параметр по ссылке (откажемся от уже рассмотренной возможности возвращать результат через возвращаемое значение).

 

 
 

В функции main ввести значения a, , . Используя функцию countX, вычислить значение X и выдать на экран.

 

 
 

 

В функции main не использовать стандартные математические функции.

 

Для того, чтобы вычислить требуемый результат, функция countX должна получить с по значению три параметра а, b и с, тип каждого значения float. В этой реализации функция результат вернет не через возвращаемое значение, тип которого теперь void. В списке ее формальных параметров появляется параметр x, тип которого float&.

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

 
 


float а

float b void

float c


float& x

Заголовок функции countX, реализуемой в таком виде, должен быть таким:

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

 

 




Поделиться с друзьями:


Дата добавления: 2015-06-29; Просмотров: 537; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.