Результаты ее выполнения таковы
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Вот исходные значения: 1.1 2.2 3.3 4.4 5.5

Вот измененные значения: 1.1 5298.23 3.3 -98.8 5.5

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

Функция change_it () объявлена как возвращающая ссылку на значение типа double. Говоря более конкретно, она возвращает ссылку на элемент массива vals , который задан ей в качестве параметра i . Таким образом, при выполнении следующей инструкции функции main ()

change_it (1) = 5298.23;                        // Изменяем 2-й элемент массива.

элементу vals[i] присваивается значение 5298,23. Поскольку функция change_it () возвращает ссылку на конкретный элемент массива vals, ее можно использовать в левой части инструкции для присвоения нового значения соответствующему элементу массива.

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

Функция change_it () объявлена как возвращающая ссылку на значение типа double. Говоря более конкретно, она возвращает ссылку на элемент массива vals , который задан ей в качестве параметра i . Таким образом, при выполнении следующей инструкции функции main ()

change_it (1) = 5298.23;                 // Изменяем 2-й элемент массива.

элементу vals [i] присваивается значение 5298,23. Поскольку функция change_it () возвращает ссылку на конкретный элемент массива vals , ее можно использовать в левой части инструкции для присвоения нового значения соответствующему элементу массива.

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

// Здесь ошибка: нельзя возвращать ссылку

// на локальную переменную. :

int &f ()

{

int i=10;

return i;

}

При завершении функции f () локальная переменная i выйдет за пределы области видимости. Следовательно, ссылка на переменную i, возвращаемая функцией f (), будет неопределенной. В действительности некоторые компиляторы не скомпилируют функцию f () в таком виде, и именно по этой причине. Однако проблема такого рода может быть создана опосредованно, поэтому нужно внимательно отнестись к тому, на какой объект будет возвращать ссылку ваша функция.

Независимые ссылки

Понятие ссылки включено в C++ главным образом для поддержки способа передачи параметров "по ссылке" и для использования в качестве ссылочного типа значения, возвращаемого функцией. Несмотря на это, можно объявить независимую переменную ссылочного типа, которая и называется независимой ссылкой. Однако справедливости ради необходимо сказать, что эти независимые ссылочные переменные используются довольно редко, поскольку они могут "сбить с пути истинного" вашу программу. Сделав (для очистки совести) эти замечания, мы все же можем уделить независимым ссылкам некоторое внимание.

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

// Использование независимой ссылки.

#include "stdafx.h"

#include <iostream>

using namespace std;

int main()

{

setlocale (LC_ALL,"Russian");

int j, k;

int &i = j;                  // независимая ссылка

j = 10;

cout << j <<" " << i;                  // Выводится: 10 10

k = 121;

i = k;                                         // Копирует в переменную j значение

// переменной к, а не адрес переменной к.

cout <<"\n" << j; // Выводится: 121

return 0;

}

При выполнении эта программа выводит следующие результаты.

10 10

121

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

i = k;

в переменную j (адресуемую ссылкой i ) копируется значение переменной к, а не ее адрес.

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

Дата: 2019-05-29, просмотров: 136.