Ссылки (C++)

В ссылке, как и в указателе, хранится адрес объекта, расположенного в другой области памяти. В отличие от указателя, ссылка после инициализации не может быть сделана, чтобы ссылаться на другой объект или задать значение NULL. Существует два типа ссылок: ссылки lvalue , которые ссылаются на именованную переменную и ссылки rvalue , которые ссылаются на временный объект. Оператор & обозначает ссылку lvalue, а && оператор обозначает либо ссылку rvalue, либо универсальную ссылку (rvalue или lvalue) в зависимости от контекста.

Ссылки могут объявляться с помощью следующего синтаксиса.

[описатель класса хранилища] [cv-qualifiers] type-specifiers [ms-modifier] декларатор [=выражение];

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

[описатель класса хранилища] [cv-qualifiers] тип-описатели [& или &&] [cv-qualifiers] идентификатор [=выражение];

Ссылки объявляются с использованием следующей последовательности.

  1. Спецификаторы объявления:

    • Необязательный спецификатор класса хранения.
    • Необязательные const и/или volatile квалификаторы.
    • Спецификатор типа: имя типа.
  2. Декларатор:

    • Необязательный модификатор, используемый в системах Microsoft. Дополнительные сведения см. в разделе "Модификаторы для конкретного майкрософт".

    • Оператор & или && оператор.

    • Необязательные const и(или) volatile квалифы.

    • Идентификатор.

  3. Необязательный инициализатор.

Более сложные формы декларатора для указателей на массивы и функции также применяются к ссылкам на массивы и функции. Дополнительные сведения см . в указателях.

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

int &i;
int &i, &j;

Ссылки, указатели и объекты могут быть объявлены вместе:

int &ref, *ptr, k;

Ссылка содержит адрес объекта, однако с синтаксической точки зрения ведет себя как объект.

В следующей программе обратите внимание, что имя объекта, s и ссылка на объект, SRef, могут использоваться идентично в следующих программах.

Пример

// references.cpp
#include <stdio.h>
struct S {
   short i;
};

int main() {
   S  s;   // Declare the object.
   S& SRef = s;   // Declare and initialize the reference.
   s.i = 3;

   printf_s("%d\n", s.i);
   printf_s("%d\n", SRef.i);

   SRef.i = 4;
   printf_s("%d\n", s.i);
   printf_s("%d\n", SRef.i);
}
3
3
4
4

См. также

Аргументы функции ссылочного типа
Возвращаемые значения функции ссылочного типа
Ссылки на указатели