Студопедия
Главная страница | Контакты | Случайная страница

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

Передача аргументов в функцию по значению

Читайте также:
  1. Cинаптическая передача
  2. В тех случаях, когда результативный показатель может быть представлен как функция от нескольких аргументов, применяется _______________ метод экономического анализа.
  3. В числе функций государственного земельного контроля можно выделить информационную, превентивную, а также функцию пресечения.
  4. Виды аргументов
  5. Виды частиц по значению
  6. Вопрос 33 :Классификация счетов по структуре и назначению и её предназначение.
  7. Вопрос 46. Международная передача технологий
  8. Выбор и передача текста документов.
  9. Дать характеристику травм, нарушающих функцию плечевого сустава
  10. Договор аренды зданий и сооружений: понятие, форма договора, передача здания, сооружения.

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

int main() {

int y = 5; fun(y);

cout<<y<<endl; // 5

}

void fun (int x){

x++;

cout<<x<<endl; // 6

}

Как мы видим, изменения, внесенные в параметр x во время выполнения функции, не влияют на значение переменной y, которая передаётся в функцию, т.е. на аргумент.

При передаче аргументов по значению функция работает с копией значений аргументов.

В качестве аргументов могут выступать константы, переменные или выражения, тип которых соответствует типу параметров.

// Пример 5.6. Обменять значения двух целочисленных переменных,

// используя функцию обмена change ().

#include <iostream>

using namespace std;

void change (int, int);

int main() {

int a = 10, b = 5;

cout<<"main(): do perestanovki \n";

cout<<"a = "<<a<<", b = "<<b<< endl; // a = 10, b = 5

change (a, b);

cout << "main(): posle perestanovki \n";

cout<<"a = "<<a<<", b = "<<b<< endl; // a = 10, b = 5

system("pause");

}

void change (int x, int y){

cout<<"change(): do perestanovki \n";

cout<<"x = "<<x<<", y = " <<y<<endl; // x = 10, y = 5

int z = x; x = y; y = z;

cout<<" change(): posle perestanovki \n";

cout<<"x = "<<x<<", y = "<<y <<endl; // x = 5, y = 10

}

В функцию change() переменные a и b передаются по значению, т.е. функция change() работает с копиями аргументов. Как мы видим, изменение копий в функции не влияет на значения переменных a и b функции main().

Ссылки

В языке С++ ссылка определена как другое имя или псевдоним уже существующей переменной. Для ссылки не требуется дополнительного пространства в памяти. Для определения ссылки применяется унарная операция &:

имя_типа & имя_ссылки = инициализатор ссылки;

Например:

int x = 5;

int & rf = x; // rx является ссылкой на x

rx++; // то же самое, что и x++

Имена x и rx – это синонимы одной и той же переменной. Поэтому операторы

x++; и rx++;

равнозначны.

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

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

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

Мы уже знаем, что функция может вернуть только одно значение. В том случае, если функция должна вернуть два или более значений, например, типа int, можно вернуть не значения, а записать их в определённых ячейках памяти. Для этого необходимо в качестве параметров функции использовать ссылки:

fun (int &x, int &y);

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

 

 

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

· в заголовке функции соответствующие параметры - ссылки записать как переменные ссылочного типа, то есть с символом &;

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

· при вызове функции в качестве аргументов использовать только переменные, причем их тип должен совпадать с типом параметров - ссылок.

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

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

int main(){

int y = 5;

fun(y);

cout<<y<<endl; // 6

}

void fun (int &x){

x++; cout<<x<<endl; // 6

}

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

// Пример 5.7. Для каждой пары введенных целых чисел найти их сумму

// и произведение двумя способами:

// 1) используя одну функцию SumMult(), возвращающей и сумму,

// и произведение двух чисел;

// 2) с помощью двух функций sum(), mult().

#include <iostream>

using namespace std;

void SumMult (int, int, int&, int&); // прототип функции SumMult()

int sum (int, int); // прототип функции sum()

int mult (int, int); // прототип функции mult()

int main() {

int a, b, r1, r2;

while(true){

cout<<"Vvedi a, b"<<" (a = 0 and b = 0 --->exit)"<<endl;

cin>>a>>b;

if(!(a || b)) break;

SumMult(a, b, r1, r2); // вызов функции SumMult()

cout<<a<<" + "<<b<<" = "<<r1<<endl;

cout<<a<<" * "<<b<<" = "<<r2<<endl;

cout<<a<<" + "<<b<<" = "<<sum(a, b)<<endl; // вызов sum()

cout<<a<<" * "<<b<<" = "<<mult(a, b)<<endl; // вызов mult()

}

system("pause");

}

void SumMult(int x, int y, int &s, int &p){ // функция SumMult()

s=x+y;

p=x*y;

}

int Sum(int x, int y){ // функция sum()

return x+y;

}

int Mult(int x, int y){ // функция mult()

return x*y;

}




Дата добавления: 2015-02-16; просмотров: 81 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2025 год. (0.01 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав