C++ Ссылка

Ссылочная переменная — это псевдоним, то есть другое имя для уже существующей переменной.

После инициализации ссылки переменной вы можете использовать имя ссылки или имя переменной для обращения к переменной.

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

Синтаксис ссылок выглядит следующим образом:

int a = 10;
int &ref = a;  // ref 是 a 的引用
  • int &refПредставляетrefявляетсяintСсылка на тип.

  • refДаaпсевдоним для,refОперация напрямую воздействует наa。

Ссылки и указатели в C++

Ссылки легко спутать с указателями; между ними есть три основных различия:

  • Нулевых ссылок не существует; ссылка должна быть связана с допустимым участком памяти.
  • После инициализации ссылки объектом её нельзя направить на другой объект. Указатель может указывать на другой объект в любое время.
  • Ссылка должна быть инициализирована при создании. Указатель может быть инициализирован в любое время.
  • Объект, на который ссылается ссылка, должен быть переменной, а указатель — адресом.
ОсобенностиСсылкаУказатель
Определение и инициализацияДолжна быть инициализирована и не может бытьnull。Его можно оставить неинициализированным, он может указывать на другие объекты в последующем коде, а также может бытьnull。
СинтаксисИспользование&Объявление, например:int &ref = a;Использование*Объявление, например:int *ptr = &a;
перепривязкаЕё нельзя перепривязать; после инициализации она всегда ссылается на один и тот же объект.Можно переназначить, чтобы он указывал на другой объект, например:ptr = &b;
Нулевое значение (допустимость null)не может бытьnull, должна быть привязана к допустимому объекту.может бытьnull, что означает, что он не указывает ни на какой объект.
Использование памятиОна не занимает дополнительную память (компилятор обычно оптимизирует её для непосредственной работы с объектом, на который она ссылается).Он занимает дополнительную память (хранит адрес, обычно одно машинное слово, например, 4 байта или 8 байт).
Способ доступаОна используется напрямую, без необходимости в операторе разыменования, например:ref = 10;нужно использовать*Используйте оператор разыменования для доступа или изменения объекта, на который указывает указатель, например:*ptr = 10;
Многоуровневая косвенностьОна не поддерживает несколько уровней косвенности (не может быть ссылки на ссылку).Он поддерживает несколько уровней косвенности (например, указатель на указатель:int **pptr;)。
Передача параметров в функциюОна часто используется для передачи параметров в функцию, с кратким синтаксисом, например:void func(int &x) { x = 10; }Он также может использоваться для передачи параметров в функцию, но требует оператора разыменования, например:void func(int *x) { *x = 10; }
Массивы и ссылкиНельзя напрямую создать массив ссылок, но можно создать ссылку на массив, например:int (&ref)[10] = arr;Можно создать массив указателей, а также можно создать указатель на массив, например:int *ptrArr[10];
БезопасностьБезопаснее не бываетnull, а синтаксис более интуитивен.Он более гибок, но чреват ошибками (например, нулевые указатели, висячие указатели и т. д.).
Внутренняя реализацияОбычно она реализуется через указатели, но компилятор оптимизирует её так, чтобы напрямую работать с объектом, на который она ссылается.Напрямую хранит адрес памяти целевого объекта.

Создание ссылок в C++

Представьте имя переменной как метку, прикреплённую к переменной в её ячейке памяти. Можно рассматривать ссылку как вторую метку, прикреплённую к переменной в её ячейке памяти. Поэтому доступ к содержимому переменной можно получить как через исходное имя переменной, так и через ссылку. Например:

int i = 17;

Мы можем объявить переменную-ссылку для i следующим образом:

int&  r = i;
double& s = d;

В этих объявлениях,&читается какСсылка。

Следовательно, первое объявление можно прочитать как"r — это ссылка на целое число, инициализированная значением i", второе объявление можно прочитать как"s — это ссылка типа double, инициализированная значением d"。

В следующем примере используются ссылки на int и double:

Пример

#include <iostream> using namespace std; int main () { // Объявить простые переменные int i; double d; // Объявить ссылочную переменную int& r = i; double& s = d; i = 5; cout << "Значение i: " << i << endl; cout << "Значение i по ссылке: " << r << endl; d = 11.7; cout << "Значение d: " << d << endl; cout << "Значение d по ссылке: " << s << endl; return 0; }

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

Value of i : 5
Value of i reference : 5
Value of d : 11.7
Value of d reference : 11.7

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

КонцепцииОписание
Передача ссылок в качестве параметровC++ поддерживает передачу ссылок в функции в качестве параметров, что безопаснее, чем передача обычных параметров.
Использование ссылок в качестве возвращаемых значенийСсылку можно возвращать из функции C++, как и другие типы данных.
Другие расширения