Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по ПЯВУ.doc
Скачиваний:
4
Добавлен:
26.10.2018
Размер:
468.48 Кб
Скачать

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

Тип "ссылка на тип" определяется так: тип&, например: int& или double&

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

Рассмотрим инициализацию ссылки: int i=0; int& iref = i;

Здесь создана новая переменная типа ссылка на int с именем iref. Физически iref - это постоянный указатель на int и, следовательно, значение ссылки после инициализации не может быть изменено. Инициализирующим значением в нашем случае является адрес переменной i, т.е. при инициализации ссылка ведёт себя как указатель.

При использовании ссылка ведёт себя не как указатель, а как переменная, адресом которой она инициализирована:

iref ++; // то же, что и i++;

int *ip=&iref; // то же, что и ip=&i.

Итак, iref стало другим именем, псевдонимом переменной i.

Ссылку можно определить так: ссылка есть такой постоянный указатель на объект, к которому всегда при его использовании неявно применяется операция разрешения указателя *.

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

double d=0.0;

int& ir = d; // Создан анонимный объект типа int;

ir = 3.0; // d - не меняется!

Здесь создаётся анонимная переменная типа int, которая инициализируется значением, полученным в результате преобразования значения типа double к типу int. Затем ссылка инициализируется значением адреса этой переменной.

Анонимный объект создаётся также, когда инициализатор не является объектом, например, является константой: int& ir = 3; // Анонимный объект получил значение 3.

Здесь сначала создается анонимный объект типа int и он инициализируется значением 3. После этого создаётся ссылка ir и инициализируется адресом анонимного объекта. Теперь ir - его псевдоним и оператор

ir = 8; устанавливает новое значение этого анонимного объекта.

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

void swap (int & x, int & y){

int t = x;

x = y;

y = t; }

Теперь обращение в вызывающей функции имеет вид:

int a = 3, b = 7;

swap (a, b);

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

Заметим, что в последнем примере можно обратиться к функции swap() и с аргументами, отличными по типу от int, и даже с аргументами, не являющимися объектами:

float a = 5, b = 2.7;

swap (a, b);

swap (3, a+b);

Однако в этих случаях функция swap() фактически никакого действия со своими аргументами не выполняет. Создаются временные объекты типа int, которые инициализируются значениями, полученными в результате преобразования a, b, a+b к типу int; затем ссылки x и y инициализируются значениями адресов этих анонимных объектов; анонимные объекты и будут изменены. Фактические параметры же останутся неизменными. Компилятор выдаст предупреждение, что он вынужден завести временные переменные, и будет работать с ними.