Рубрики

Ссылки на C ++

Когда переменная объявляется как ссылка, она становится альтернативным именем для существующей переменной. Переменную можно объявить как ссылку, указав в объявлении '&'.

#include<iostream>

using namespace std;

  

int main()

{

  int x = 10;

  

  // ссылка является ссылкой на х.

  int& ref = x;

  

  // Значение х теперь изменено на 20

  ref = 20;

  cout << "x = " << x << endl ;

  

  // Значение х теперь изменено на 30

  x = 30;

  cout << "ref = " << ref << endl ;

  

  return 0;

}

Выход:

 x = 20
ref = 30

Приложения :

  1. Измените переданные параметры в функции : если функция получает ссылку на переменную, она может изменить значение переменной. Например, в следующей программе переменные меняются местами с помощью ссылок.

    #include<iostream>

    using namespace std;

      

    void swap (int& first, int& second)

    {

        int temp = first;

        first = second;

        second = temp;

    }

      

    int main()

    {

        int a = 2, b = 3;

        swap( a, b );

        cout << a << " " << b;

        return 0;

    }

    Выход:

     3 2 
  2. Избегание копирования больших структур . Представьте себе функцию, которая должна получать большой объект. Если мы передадим его без ссылки, будет создана его новая копия, что приведет к потере процессорного времени и памяти. Мы можем использовать ссылки, чтобы избежать этого.

    struct Student {

       string name;

       string address;

       int rollNo;

    }

      
    // Если мы удалим & в функции ниже, новый
    // копия объекта студента создана.
    // Мы используем const, чтобы избежать случайных обновлений
    // в функции как цель функции
    // должен печатать только s.

    void print(const Student &s)

    {

        cout << s.name << "  " << s.address << "  " << s.rollNo;

    }

  3. В Для каждого цикла, чтобы изменить все объекты : Мы можем использовать ссылки для каждого цикла, чтобы изменить все элементы.

    #include <bits/stdc++.h> 

    using namespace std; 

      

    int main() 

        vector<int> vect{ 10, 20, 30, 40 }; 

      

        // Мы можем изменить элементы, если мы

        // использовать ссылку

        for (int &x : vect) 

            x = x + 5;

      

        // Печатные элементы

        for (int x : vect) 

           cout << x << " "

      

        return 0; 

  4. В Для каждого цикла, чтобы избежать копирования объектов : Мы можем использовать ссылки для каждого цикла, чтобы избежать копирования отдельных объектов, когда объекты большие.

    #include <bits/stdc++.h> 

    using namespace std; 

      

    int main() 

        vector<string> vect{"geeksforgeeks practice"

                         "geeksforgeeks write",

                         "geeksforgeeks ide"}; 

      

        // Мы избегаем копирования всей строки

        // объект с использованием ссылки.

        for (const auto &x : vect) 

           cout << x << endl; 

      

        return 0; 

    }

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

Указатель может быть объявлен как void, но ссылка никогда не может быть void
Например

int a = 10;
void* aa = &a;. //it is valid
void &ar = a; // it is not valid

Спасибо Shweta Bansal за добавление этого пункта.

Ссылки менее мощные, чем указатели

1) Как только ссылка создана, она не может быть позже сделана для ссылки на другой объект; это не может быть повторно установлено. Это часто делается с помощью указателей.
2) Ссылки не могут быть NULL. Указатели часто имеют значение NULL, чтобы указать, что они не указывают ни на одну действительную вещь.
3) Ссылка должна быть инициализирована при объявлении. Там нет такого ограничения с указателями

Из-за вышеуказанных ограничений ссылки в C ++ не могут использоваться для реализации структур данных, таких как Linked List, Tree и т. Д. В Java ссылки не имеют вышеуказанных ограничений и могут использоваться для реализации всех структур данных. Ссылки, являющиеся более мощными в Java, являются основной причиной, по которой Java не нуждается в указателях.

Ссылки безопаснее и проще в использовании:
1) Безопаснее: поскольку ссылки должны быть инициализированы, дикие ссылки, такие как дикие указатели , вряд ли существуют. Все еще возможно иметь ссылки, которые не относятся к действительному местоположению (см. Вопросы 5 и 6 в упражнении ниже)
2) Легче в использовании: для доступа к значению для ссылок не требуется оператор разыменования. Их можно использовать как обычные переменные. Оператор '&' необходим только во время объявления. Кроме того, к элементам ссылки на объект можно получить доступ с помощью оператора точки ('.'), В отличие от указателей, где для доступа к элементам необходим оператор стрелки (->).

Вместе с вышеуказанными причинами, есть несколько мест, таких как аргумент конструктора копирования, где указатель не может быть использован. Ссылка должна быть использована для передачи аргумента в конструкторе копирования. Аналогично, ссылки должны использоваться для перегрузки некоторых операторов, таких как ++.

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

Вопрос 1

#include<iostream>

using namespace std;

  

int &fun()

{

    static int x = 10;

    return x;

}

int main()

{

    fun() = 30;

    cout << fun();

    return 0;

}

вопрос 2

#include<iostream>

using namespace std;

  

int fun(int &x)

{

    return x;

}

int main()

{

    cout << fun(10);

    return 0;

}

Вопрос 3

#include<iostream>

using namespace std;

  

void swap(char * &str1, char * &str2)

{

  char *temp = str1;

  str1 = str2;

  str2 = temp;

}

  

int main()

{

  char *str1 = "GEEKS";

  char *str2 = "FOR GEEKS";

  swap(str1, str2);

  cout<<"str1 is "<<str1<<endl;

  cout<<"str2 is "<<str2<<endl;

  return 0;

}

Вопрос 4

#include<iostream>

using namespace std;

  

int main()

{

   int x = 10;

   int *ptr = &x;

   int &*ptr1 = ptr;

}

Вопрос 5

#include<iostream>

using namespace std;

  

int main()

{

   int *ptr = NULL;

   int &ref = *ptr;

   cout << ref;

}

Вопрос 6

#include<iostream>

using namespace std;

  

int &fun()

{

    int x = 10;

    return x;

}

int main()

{

    fun() = 30;

    cout << fun();

    return 0;

}

Статьи по Теме :

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Ссылки на C ++

0.00 (0%) 0 votes