Ссылки

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

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

Набирайте следующий пример и всё должно стать понятным:

#include <iostream>

using namespace std;

 

void showVariables(int varInt, double varDbl);

void change(int varInt, double varDbl);      //  передача по значению

void changeRef(int& varInt, double& varDbl); //  передача по ссылке

void changePtr(int* varInt, double* varDbl); //  передача по указателю

 

int main()

{

setlocale(LC_ALL, "rus");

 

int varInteger = 0;

double varDouble = 0.0;

 

cout << "Передаем параметры по значению!" << endl;

change(varInteger, varDouble);

showVariables(varInteger, varDouble);

 

cout << "Передаем параметры по ссылке!" << endl;

changeRef(varInteger, varDouble);     // передаем, как обычную переменную

showVariables(varInteger, varDouble);

 

cout << "Передаем параметры по указателю!" << endl;

changePtr(&varInteger, &varDouble);   // используем амперсанд, чтобы передать адрес

showVariables(varInteger, varDouble);

 

return 0;

}

 

void showVariables(int varInt, double varDbl)

{

cout << "Значения переменных после изменений:\n";

cout << "Первая переменная (int) = " << varInt << endl;

cout << "Вторая переменная (double) = " << varDbl << endl;

cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n";

}

//================================================================

void change(int varInt, double varDbl)

{

varInt = 100;

varDbl = 111.11;;

}

//================================================================

void changeRef(int& varInt, double& varDbl)

{

varInt = 200;     // обращаемся, как к обычной переменной

varDbl = 222.22;

}

//================================================================

void changePtr(int* varInt, double* varDbl)

{

*varInt = 300;     // применяем разыменование

*varDbl = 333.33;

}

Начнем с функции change(). Вызвав ее в строке 17 исходного кода, передаем в неё переменные по значению. Функция благополучно создаст копии этих переменных, запишет в них данные и, завершая свою «нелегкую» работу, уничтожит эти копии. В итоге никаких изменений с передаваемыми переменными не произойдёт.

Теперь посмотрите на определение функции changeRef(), в которую параметры передаются по ссылке — строки 45 — 49. Как говорилось выше, мы использовали & , чтобы сообщить компилятору о том, что принимаемые параметры — это ссылки. Внутри самой функции мы обращаемся к ссылкам, как к обычным переменным. То есть нам не надо применять операцию разыменования, если надо изменить значение переменной:

А вызывая эту функцию из главной (строка 21), нам не надо, при передаче переменных, применять операцию взятия адреса (тот же & , но с другим подтекстом), как это необходимо делать при передаче по указателю. Результат работы функции увидим, отобразив значение переменных на экран. Значения переменных успешно изменены.

Напоследок — передача по указателю. Сразу к определению changePtr() — строки 51 — 55. Тут есть то, чего мы не использовали при передаче по ссылке — разыменование указателей для изменения значений переменных:

Так как функция должна принять переменные по указателю, а указатель хранит адрес, то при вызове (строка 25) передаём в неё адреса переменных:

Результат работы программы:

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

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

Так в программе мы можем использовать имя ссылки для последующего обращения к данным, которые хранит aaa. Это если например кто-то до вас написал код и дал название переменной aaa. Этот программист знает, что она хранит количество ящиков. А вы, для своего удобства, дали этой переменной псевдоним amountOfBoxes и используете это новое имя, дописывая какой-то новый код в программу.