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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

 

type & имя ссылки = имя переменной;

Основные достоинства ссылок проявляются при работе с функциями.

Если определить ссылку type&a и не инициализировать ее, то это равносильно созданию объекта, который имеет имя, но не связан ни с каким участком памяти. Это является ошибкой.

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

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

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

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

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

...

void RRR (int & a, int &b, int & c)

{ a += 100; b+= 100; c+= 100;

cout << a <<b <<c;

}

Void main ()

{ int a1=1, b1 =2, c1=3;

cout << a1 << b1 <<c1;

RRR(a1, b1, c1);

cout << a1 <<b1 << c1;

}

Результат:

1 2 3 // переменные до вызова функции

101 102 103 // изменения параметров в функции

101 102 103 // функция изменила фактические параметры

 

На рисунке 3 показано, как функция непосредственно обрабатывает внешние по отношению к ней переменные. При этом в функции не выделяется память под формальные параметры, формальный параметр – это абстракция, просто имя, которое при передаче фактического параметра связывается с внешним по отношению к функции участком памяти.

 
 


Стек

101 102 103 -знач. переменных после вызова функции

1 2 3 - знач. переменных до вызова функции

a1 b1 c1 - переменные адреса

A b c - ссылки

 

Рисунок 3 – Схема обработки данных функцией при передаче параметров по ссылке

 

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



Поделиться:


Последнее изменение этой страницы: 2017-02-19; просмотров: 219; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.83.97 (0.005 с.)