3.5. Ссылки - StriderAJR/StudentCpp GitHub Wiki

Рассматриваемые темы:

Ссылки

#pragma once

#include <iostream>
using namespace std;

namespace References
{
    int main()
    {
      int a = 5;
      int& ref_a = a;                        // Это и есть переменная типа ссылка
      int& ref_test;                         // Тут при компиляции будет ошибка
      cout << "a = " << a << endl;           // Выведет 5
      cout << "ref_a = " << ref_a << endl;   // Тоже выведет 5
      
      a++;                                   // Увеличили значение ячейки на 1
      cout << "ref_a = " << ref_a << endl;   // Выведется 6!
                                             // Потому что ref_a - это та же ячейка, которую мы только что увеличили на 1

      ref_a++;                               // Увеличили значение все той же ячейки на 1
      cout << "a = " << a << endl;           // Выведется 7!
      int b = ref_a;
      cout << "b = " << b << endl;
      b++;
      cout << "b = " << b << endl;
      cout << "a = " << a << endl;
      return 1;
    }
}

Ссылка - это альтернативное имя переменной

Во многих учебниках ссылку называют константным указателем или неявный указателем, подразумевая таким образом то, как ссылка реализуется на низком уровне компилятором С++. Ссылка действительно реализуется "под капотом" через указатель, который будет разменовываться самостоятельно без вашего участия.Но дело в том, что для нас, программистом, тех, кто использует ссылочный тип данных в своем коде, ссылка ни по поведению, ни по смыслу НИЧЕМ НЕ ПОХОЖА НА УКАЗАТЕЛЬ! Это все равно, что называть автомобиль пылесосом, потому оба делают забор воздуха из окружающей среды.Воспринимайте и характеризуйте ссылку именно как альтернативное имя ячейки памяти. Это как дополнительный ярлычок, с помощью которого вы можете обратиться к ячейке. Не связывайте в своей голове указатель и ссылку. Между ними нет ничего общего в плане применения. Теперь подробнее про ссылки. Допустим, мы создали в памяти ячейку с именем а и типом данных int, записали туда, какое-то значние.

 int a = 5;

Теперь в памяти есть ячейка с именем a и значением 5

Tabl1

Теперь создадим ссылку на эту переменную

int& ref_a = a;             // Это и есть переменная типа ссылка

int& - тип данных "ссылка".

int - тип данных переменной, на которую мы создали ссылку.

& - синтаксический символ обозначающий ссылку.

ref_a** - имя переменной типа ссылка.

Теперь в памяти есть ячейка с именем a и значением 5.

Tabl2

Обратите внимание, что в памяти не вывелилось новых ячеек памяти. Ячейка так и осталась одна, но у нее появилось второе имя, с помощью которого к ней можно обращаться. Это и есть ссылка. Альтернативное имя переменной.

ВАЖНО!

При создании ссылки ее нужно обязательно сразу же проициализировать. Ссылка не может висеть в воздухе! Ей сразу нужно сказать альтернативное имя чего она является.

int& ref_test; // Тут при компиляции будет ошибка

Теперь у нас в памяти есть 1 ячейка, которая хранит значение 5 и 2 имени для этой ячейки: a и ref_a

Еще несколько важных слов о ссылках:

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

2. Ссылка не может быть неопределенной или иметь значение NULL

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

⚠️ **GitHub.com Fallback** ⚠️