Посилання

Ми з вами вже ознайомилися із звичайними змінними та вказівниками. Тепер, нам слід, ознайомитися ще з одним мови

Посилання можна порівняти із псевдонімом. Тобто, уявіть ситуацію. Ви маєте якусь змінну з довгим ім’ям або вам потрібно використовувати якусь змінну із структури. При цьому, використовувати такі змінні доводиться доволі часто. То, ви можете створити посилання на ці змінні яке буде коротше в записі і використовувати його. Посилання за своїм принципом роботи схожі на вказівники (в реальності, посилання реалізовані за допомогою вказівників).

Для того щоб створити посилання вам необхідно:

1. Вказати тип посилання. Цей тип має бути таким же як тип змінної на яку він робиться.

2. Поставити символ У вказівниках цей символ використовують для отримання адреси змінної. Тут, він означає «посилання (не на веселі букви, а

3. Вказати ім’я посилання.

4. Поставити символ присвоєння та вказати ім’я змінної на яку робимо посилання.

Зауважте, ми відразу надаємо якесь значення посиланню. Це має бути саме змінна, а не число, символ і так далі. Посилання мають бути ініціалізованими відразу при створені.

При цьому, посилання не можуть змінювати свого значення. Тобто, ви не зможете створити посилання на одну змінну, а потім зробити його на іншу. Адже, псевдонім одного письменника не може стати псевдонімом іншого. По тій же причині посилання не може бути порожнім.

Створення посилання виглядатиме так:


        Тип_посилання & ім’я_посилання = ім’я_змінної_на_яку_робимо_посилання;
        

При цьому, щоб використати посилання достатньо вказати лише його

Розглянемо це на прикладі:

    
            #include <iostream>

            int main()
            {
                int a = 8;

                //створюємо посилання "b" на змінну "а"
                int& b = a;

                //перевіряємо яке значення буде мати посилання
                //зверніть увагу, що для використання ми вказуємо
                //лише ім'я посилання
                std::cout << "b = " << b << std::endl;

                //вказуємо для посилання нове значення.
                //важливо! не посилання на нову змінну, а саме значення
                b = 23;

                //оскільки, змінна та посилання на неї це одне і теж,
                //то значення змінної "а" тепер буде "23"
                std::cout << "a = " << a << std::endl;

                return 0;
            }
        

Змінна та посилання на неї дійсно є одним і тим же. Наприклад, якщо ви спробуєте отримати адресу посилання, то отримаєте адресу змінної на яку йде посилання. Ви можете добавити наступний код до попередньої програми та переконатися в цьому.

    
            //адреса змінної "а"
            std::cout << "&a = " << &a << std::endl;

            //адреса посилання "b" на змінну "а"
            std::cout << "&b = " << &b << std::endl;
        

Якщо, початкова змінна є константною, то ваше посилання також має бути константним. Але, якщо, початкова змінна є не константною, то посилання на неї може бути як константним так і не константним. щоб створити константну змінну потрібно написати ключове слово перед типом змінної.

    
            //створюємо не константну змінну
            int a = 8;

            //відповідно, для неї можна створити:
            //константне посилання "b" на змінну "а"
            const int& b = a;

            //не константне посилання "с" на змінну "а"
            int& c = a;

            //створюємо константну змінну "d"
            const int d = 12;

            //для неї можна створити константне посилання
            const int& e = d;

            //константному посиланню можна надати значення
            //яке не є змінною
            const int& a = 7;
        

Також, ви можете використовувати посилання в якості аргументу функції. В такій ситуації ви зможете змінювати значення змінної яку передаєте у функцію. Це буде працювати як і вказівник.

Для того щоб створити посилання в якості аргументу функції необхідно:

1. Вказати тип посилання.

2. Поставити символ

3. Вказати ім’я посилання.

Щоб передати змінну в якості аргумента функції на місце посилання достатньо лише вказати цієї змінної. Звісно, ж ця змінна має бути такого ж типу як і аргумент.

Ви не можете передати в не константне посилання число, символ чи інше значення. Це має бути саме змінна! При цьому, не константне посилання не може мати значення за замовчуванням.

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

Наприклад:

    
            #include <iostream>

            //створюємо функцію в якості аргументу якої
            //виступає посилання
            void fun(int& b)
            {
                std::cout << "input number: " << std::endl;

                //оскільки посилання має доступ на пряму до значення,
                //то змінивши значення посилання ("b") ми змінимо
                //значення змінної яку передали у функцію
                std::cin >> b;
            }

            int main()
            {
                //створюємо змінну зі значенням "8"
                int a = 8;

                //передаємо нашу змінну у функцію яка використовує
                //посилання в якості аргументу, тому наша
                //змінна "а" змінить своє значення, якщо ми змінимо
                //його в середині даної функції
                fun(a);

                //дивимося на значення нашої змінної "а"
                std::cout << a << std::endl;

                return 0;
            }
        

Якщо, ви хочете щоб ваше значення залишилося не змінним, то створюйте константне посилання:


        void fun(const int& b)
        

Якщо ви використовуєте константне посилання в якості аргументу функції, то ви можете надати йому значення за замовчуванням. Також, такому аргументу ви можете передавати звичайне значення.

    
            #include <iostream>

            //враховуючи, що посилання є константним, то
            //йому можна надати значення за замовчуванням
            void fun(const int& a = 3)
            {
                std::cout << a << std::endl;
            }

            int main()
            {
                //і в якості аргумента функції можна передавати
                //значення, а не якусь змінну
                fun(7);

                return 0;
            }
        

Як вже було написано раніше, що посилання це є як псевдонім. Наприклад, ви можете мати якусь змінну яка належить структурі і при цьому вам доводиться дуже часто використовувати дану змінну. Щоб кожного разу не записувати весь шлях до цієї змінної, то можна створити посилання на неї. Після чого використовувати його.

    
            #include <iostream>

            //створимо якусь структуру
            struct A
            {
                //в ній буде знаходитися необхідна нам змінна
                int age;
            };

            struct B
            {
                //цю структуру помістимо в середину іншої структури
                //для того, щоб шлях до змінної був довшим.
                //це необхідно для кращого розуміння
                A a;
                int number;
            };

            int main()
            {
                B b;

                //як бачите, щоб добратися до змінної "age"
                //потрібно вказати доволі довгий шлях
                b.a.age = 4;

                std::cout << b.a.age << std::endl;

                //створимо посилання на змінну "age".
                //для цього вказуємо весь шлях до неї
                int& c = b.a.age;

                //змінюємо значення посилання
                c = 7;

                //відповідно і значення нашої змінної теж зміниться
                std::cout << b.a.age << std::endl;

                return 0;
            }
        

Посилання по факту є спрощеним вказівником. Зазвичай його використовують коли необхідний прямий доступ до значення змінних. Звісно, ви можете не забивати цим голову. Адже, робота із вказівниками є набагато важливіша. Вказівники мають більший функціонал. Але, в якості альтернативи для не складних задач чи як аргумент функції зручно використовувати посилання.