АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Функции. Передача по ссылке. Передача по ссылке аргументов стандартных типов и структурных переменных. Аргументы по умолчанию

Читайте также:
  1. I. Передача профессии из поколения в поколение
  2. Multicast ( групповая передача)
  3. RS-триггеры S, R и E-типов
  4. А) ПЕРЕДАЧА НА РУССКОМ ЯЗЫКЕ ФУНКЦИИ АРТИКЛЯ
  5. Абстрактные классы и чистые виртуальные функции. Виртуальные деструкторы. Дружественные функции. Дружественные классы.
  6. Алгебраическое интерполирование функции.
  7. Аналіз деяких типових конфліктів у військових колективах
  8. Аномалии развития скелета и структурных дефектов у собак
  9. Аргументы в пользу протекционизма
  10. Аргументы против социальной ответственности
  11. Аргументы «за» и «против» социальной ответственности
  12. Аргументы «за» и «против» страхования валютных рисков

Функция представляет собой именованное объединение группы операторов. Это объединение может быть вызвано из других частей программы.

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

Причиной, из-за которой в свое время была создана концепция функций, стало стремление сократить размер программного кода. Любая последовательность операторов, встречающаяся в программе более одного раза, будучи вынесенной в отдельную функцию, сокращает размер программы. Несмотря на то, что функция в процессе выполнения программы исполняется не один раз, ее код хранится только в одной области памяти.

 

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

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

одного, а множества значений.

Передача по ссылке аргументов стандартных типов.

void intfrac(float n, float & intp, float & fracp)

Аргументы, передаваемые по ссылке, обозначаются знаком &, который следует за типом аргумента: float& intp

Знак & означает, что intp является псевдонимом для той переменной, которая

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

имя intp в функции intfrac(), фактически мы оперируем значением соответствующей переменной функции main(). Знак & (амперсанд) символизирует ссылку, поэтому запись float& intp означает, что intp является ссылкой на переменную типа float. Точно так же fracp является ссылкой на переменную типа float.

Если какие-либо аргументы передаются в функцию по ссылке, то в прототипе функции необходимо с помощью знака & указывать соответствующий параметр-ссылку:

void intfrac(float, float&, float&); // амперсанды в прототипе

Аналогичным образом знаком & отмечаются ссылочные параметры в определении функции. Однако обратите внимание на то, что при вызовах функции амперсанды отсутствуют:



intfrac(number, intpart, fracpart); // амперсанды отсутствуют в вызове

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

Передача структурных переменных по ссылке

Вы можете применять механизм передачи по ссылке не только к переменным

стандартных типов, но и к структурным переменным.

Следующая программа, REFERST, производит масштабирование значений типа Distance. Масштабирование представляет собой умножение нескольких длин на один и тот же коэффициент. Так, если исходная длина равна 6'-8", а коэффициент масштабирования равен 0.5, то длина, получаемая в результате масштабирования, равна 3'-4". Масштабирование .можно применить, например, к трем измерениям помещения, что приведет к изменению размеров этого помещения с одновременным сохранением его пропорций.

// referst.cpp

// передача структурной переменной по ссылке

#include <iostream>

using namespace std;

struct Distance // длина в английской системе

{

int feet;

float inches;

};

void scale( Distance&, float ); // прототипы функций

void engldisp( Distance );

int main()

{

Distance d1 = { 12, 6.5 }; //инициализация d1 и d2

Distance d2 = { 10, 5.5 };

cout << "d1 = "; engldisp(d1); //вывод исходных значений d1 и d2

cout << "\nd2 = "; engldisp(d2);

scale(d1, 0.5); // масштабирование d1 и d2

scale(d2, 0.25);

cout << "\nd1 = "; engldisp(d1); // вывод новых значений d1 и d2

cout << "\nd2 = "; engldisp(d2);

cout << endl;

return 0;

}

//-- функция scale()---масштабирование значения типа Distance ---------------

void scale( Distance& dd, float factor )

{

float inches = (dd.feet*12 + dd.inches)*factor; //перевод футов в дюймы и ум-

dd.feet = static_cast<int>(inches/12); //ножение на коэффициент

‡агрузка...

dd.inches = inches - dd.feet *12;

}

// функция engldisp()

// отображает значение типа Distance на экране

void engldisp( Distance dd ) // параметр dd типа Distance

{

cout << dd.feet << "\'-" << dd.inches <<"\"";

}

Программа инициализирует две переменные типа Distance, d1 и d2, и выводит

их значения на экран. Затем вызывается функция scale(), которая производит

умножение длины d1 на коэффициент 0.5, а длины d2 — на коэффициент 0.25.

После этого на экран выводятся новые значения d1 и d2:

d1 = 12'-6.5"

d2 = 10'-5.5"

d1 = 6'-3.25"

d2 = 2'-7.375"

Вызовы функции scale() в программе выглядят следующим образом:

scalе(d1, 0.5);

scale(d2, 0.25);

Первый вызов производит масштабирование с коэффициентом 0.5, а второй —

с коэффициентом 0.25. Обратите внимание на то, что значения d1 и d2, передаваемые по ссылке, изменяются непосредственно в функции; никакого значения функция при этом не возвращает. Поскольку изменяется только один аргумент, можно было бы модифицировать функцию scale(), передавая ей этот аргумент по значению и возвращая масштабируемую величину с помощью оператора return. В этом случае вызов функции выглядел бы так:

d1 = scale(d1, 0.5)

Конечно, такой способ является чересчур длинным.

 

Аргументы по умолчанию

Можно организовать функцию, имеющую аргументы, таким образом, что ее можно будет вызывать, вообще не указывая при этом никаких аргументов. Однако для этого при объявлении функции необходимо задать значения аргументов по умолчанию: void repchar(char='*', int=45);

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

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

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |


При использовании материала, поставите ссылку на Студалл.Орг (0.01 сек.)