Когда переменная объявляется как ссылка, она становится альтернативным именем для существующей переменной. Переменную можно объявить как ссылку, указав в объявлении '&'.
|
Выход:
x = 20 ref = 30
Приложения :
- Измените переданные параметры в функции : если функция получает ссылку на переменную, она может изменить значение переменной. Например, в следующей программе переменные меняются местами с помощью ссылок.
#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
- Избегание копирования больших структур . Представьте себе функцию, которая должна получать большой объект. Если мы передадим его без ссылки, будет создана его новая копия, что приведет к потере процессорного времени и памяти. Мы можем использовать ссылки, чтобы избежать этого.
struct
Student {
string name;
string address;
int
rollNo;
}
// Если мы удалим & в функции ниже, новый
// копия объекта студента создана.
// Мы используем const, чтобы избежать случайных обновлений
// в функции как цель функции
// должен печатать только s.
void
print(
const
Student &s)
{
cout << s.name <<
" "
<< s.address <<
" "
<< s.rollNo;
}
- В Для каждого цикла, чтобы изменить все объекты : Мы можем использовать ссылки для каждого цикла, чтобы изменить все элементы.
#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;
}
- В Для каждого цикла, чтобы избежать копирования объектов : Мы можем использовать ссылки для каждого цикла, чтобы избежать копирования отдельных объектов, когда объекты большие.
#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
|
вопрос 2
|
Вопрос 3
|
Вопрос 4
|
Вопрос 5
|
Вопрос 6
|
Статьи по Теме :
- Указатели против ссылок в C ++
- Когда мы передаем аргументы по ссылке или по указателю?
- Могут ли ссылки ссылаться на неверное расположение в C ++?
- Передача по указателю против передачи по ссылке в C ++
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Указатели и ссылки на C ++
- C ++ | Отзывы | Вопрос 1
- C ++ | Отзывы | Вопрос 6
- Указатели против ссылок в C ++
- C ++ | Отзывы | Вопрос 4
- C ++ | Отзывы | Вопрос 6
- C ++ | Отзывы | Вопрос 6
- Оператор назначения по умолчанию и ссылки
- Могут ли ссылки ссылаться на неверное расположение в C ++?
- Предопределенные макросы в C с примерами
- Как создать графический интерфейс в программировании на C, используя GTK Toolkit
- C ++ программа для печати всех четных и нечетных чисел от 1 до N
- Переверните содержимое файла и сохраните его в другом
- C программа для сортировки массива в порядке возрастания
0.00 (0%) 0 votes