C++ Referencias

Una variable de referencia es un alias, es decir, es otro nombre de una variable ya existente.

Una vez que la referencia se inicializa con una variable, se puede usar el nombre de la referencia o el nombre de la variable para referirse a la variable.

La referencia debe inicializarse en el momento de la definición y, una vez vinculada a una variable, no puede vincularse a otra variable.

La sintaxis de la referencia es la siguiente:

int a = 10;
int &ref = a;  // ref 是 a 的引用
  • int &refindica querefes unaintreferencia de tipo.

  • refSíael alias de, y sobrereflas operaciones sobre afectarán directamente aa。

C++ Referencias vs punteros

Las referencias se confunden fácilmente con los punteros; hay tres diferencias principales entre ellos:

  • No existen referencias nulas; una referencia debe estar conectada a una memoria válida.
  • Una vez que una referencia se inicializa con un objeto, no puede apuntar a otro objeto. Un puntero puede apuntar a otro objeto en cualquier momento.
  • Una referencia debe inicializarse al crearse. Un puntero puede inicializarse en cualquier momento.
  • El objeto de una referencia debe ser una variable, mientras que un puntero debe ser una dirección.
CaracterísticaReferenciaPuntero
Definición e inicializaciónDebe inicializarse y no puede sernull。Puede no inicializarse, puede apuntar a otros objetos en código posterior, puede sernull。
SintaxisSe usa&para declarar, por ejemplo:int &ref = a;Se usa*para declarar, por ejemplo:int *ptr = &a;
ReenlaceNo se puede reenlazar; una vez inicializada, siempre hace referencia al mismo objeto.Puede volver a apuntar a otros objetos, por ejemplo:ptr = &b;
Valor nulo (nullable)No puede sernull, debe estar vinculada a un objeto válido.Puede sernull, lo que significa que no apunta a ningún objeto.
Ocupación de memoriaNo ocupa memoria adicional (el compilador normalmente lo optimiza para operar directamente sobre el objeto referenciado).Ocupa memoria adicional (almacena la dirección, normalmente una palabra de máquina, como 4 u 8 bytes).
Forma de accesoSe usa directamente, sin operador de desreferencia, por ejemplo:ref = 10;Se necesita usar*el operador de desreferencia para acceder o modificar el objeto apuntado, por ejemplo:*ptr = 10;
Acceso indirecto múltipleNo admite acceso indirecto múltiple (no puede haber referencias a referencias).Admite acceso indirecto múltiple (como puntero a puntero:int **pptr;)。
Paso de parámetros a funcionesSe usa a menudo para pasar parámetros a funciones, con sintaxis simple, por ejemplo:void func(int &x) { x = 10; }También se puede usar para pasar parámetros a funciones, pero requiere el operador de desreferencia, por ejemplo:void func(int *x) { *x = 10; }
Arreglos y referenciasNo se pueden crear arreglos de referencias directamente, pero se puede crear una referencia a un arreglo, por ejemplo:int (&ref)[10] = arr;Se pueden crear arreglos de punteros, y también punteros a arreglos, por ejemplo:int *ptrArr[10];
SeguridadMás segura, no puede sernull, y su sintaxis es más intuitiva.Más flexible, pero propenso a errores (como punteros nulos, punteros salvajes, etc.).
Implementación subyacenteNormalmente se implementa mediante punteros, pero el compilador lo optimiza para operar directamente sobre el objeto referenciado.Almacena directamente la dirección de memoria del objeto destino.

Crear referencias en C++

Imagina que el nombre de una variable es una etiqueta adjunta a la variable en una ubicación de memoria; puedes considerar la referencia como una segunda etiqueta adjunta a la variable en esa ubicación de memoria. Por lo tanto, puedes acceder al contenido de la variable mediante el nombre de la variable original o mediante la referencia. Por ejemplo:

int i = 17;

Podemos declarar una variable de referencia para i, como se muestra a continuación:

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

En estas declaraciones,&se lee comoreferencia。

Por lo tanto, la primera declaración se puede leer como"r es una referencia entera inicializada con i", la segunda declaración se puede leer como"s es una referencia double inicializada con d"。

El siguiente ejemplo utiliza referencias int y double:

Ejemplo

#include <iostream> using namespace std; int main () { // declarar variables simples int i; double d; // declarar variables de referencia int& r = i; double& s = d; i = 5; cout << "Value of i : " << i << endl; cout << "Value of i reference : " << r << endl; d = 11.7; cout << "Value of d : " << d << endl; cout << "Value of d reference : " << s << endl; return 0; }

Cuando el código anterior se compila y ejecuta, produce los siguientes resultados:

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

Las referencias se usan normalmente en listas de parámetros de funciones y en valores de retorno de funciones. A continuación se enumeran dos conceptos importantes relacionados con las referencias en C++ que todo programador de C++ debe conocer:

ConceptoDescripción
Usar referencias como parámetrosC++ admite pasar referencias como parámetros a funciones, lo cual es más seguro que pasar parámetros normales.
Usar referencias como valores de retornoSe puede devolver una referencia desde una función de C++, igual que se devuelven otros tipos de datos.
Otras extensiones