2010-05-04 28 views
25

¿Cuál sería una breve definición de una variable de referencia en C++?¿Qué es una variable de referencia en C++?

+2

Las referencias pueden ser útiles porque imponen el uso de la memoria inicializada (es decir, no pueden hacer referencia a null, cuando se usan normalmente). –

+1

Una referencia es solo azúcar sintáctica para un puntero 'const' (no necesariamente puntero-a-const). No existe una protección particular contra la referencia a NULL, causa un comportamiento indefinido y desreferencia un puntero NULL. Pedagógicamente se puede decir que el llamante violó el estándar C++ desreferenciando NULL y pasando una referencia NULL, en lugar de violar el contrato API pasando un puntero NULL como un parámetro no anulable, pero técnicamente y en el comportamiento típico del tiempo de ejecución no hay diferencia lo que. –

+0

http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and-reference-variable-in-c –

Respuesta

2

variables de referencia permiten dos nombres de variables para hacer frente a la misma posición de memoria:

int main() 
{ 
    int var1; 

    // var2 is a reference variable, holds same value as var1 

    int &var2 = var1; 
    var1 = 10; 

    std::cout << "var1 = " << var1 << std::endl; 
    std::cout << "var2 = " << var2 << std::endl; 
} 

de recursos: LINK

3

Es una variable que referencias otro:

int foo; 
int& bar = foo; 

bar es ahora una referencia, lo que quiere decir que bar tiene el ubicación de la memoria donde se encuentra foo.

Consulte here para obtener más información.

+2

Técnicamente no. Si la barra es una variable, puede obtener su dirección. Una referencia es un alias de otra variable (no la dirección de, ya que esto implicaría que el compilador necesitaría insertar una operación de desreferencia). Cuando esto se compila, es probable que la barra simplemente sea reemplazada por foo. –

+0

Su texto describe un puntero. Una referencia no contiene ninguna ubicación de memoria y puede no requerir ningún almacenamiento. (En su ejemplo, probablemente 'bar' no use ningún almacenamiento). –

6

El primer párrafo de la Wikipedia article fácilmente podría servir como una breve definición:

En el lenguaje de programación C++, una referencia es un simple tipo de datos de referencia que es menos potente pero más seguro que el tipo de puntero heredado de C .

Y citando el mismo artículo:

referencias C++ difieren de los punteros de varias maneras esenciales:

  • No es posible hacer referencia directamente a un objeto de referencia una vez definido; cualquier aparición de su nombre se refiere directamente al objeto al que hace referencia.

  • Una vez que se crea una referencia, no se puede hacer más tarde para hacer referencia a otro objeto; no puede ser resecado Esto se hace a menudo con punteros.

  • Las referencias no pueden ser nulas, mientras que los punteros pueden; cada referencia se refiere a algún objeto, aunque puede o no ser válido.

  • Las referencias no se pueden inicializar. Debido a que es imposible reinicializar una referencia, deben inicializarse tan pronto como se creen. En particular, las variables locales y globales deben inicializarse donde están definidas, y las referencias que son miembros de datos de instancias de clase deben inicializarse en la lista de inicializadores del constructor de la clase.

Lectura adicional:

+1

Wikipedia no es una fuente muy autorizada. –

17

A referencia es una entidad que es un alias para una otro objeto.

A referencia no es una variable como una variable solamente se introduce por la declaración de un objeto. Un objeto es una región de almacenamiento y, en C++, las referencias no ocupan (necesariamente) ningún almacenamiento.

Como objetos y referencias son grupos distintos de entidades en C++ por lo que el término "variable de referencia" no es significativa.

+4

Bueno, todavía no * una * variable. Es bueno que C++ 0x solucione eso: ha sido un problema de larga data en el estándar. Vea http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#633 y eche un vistazo a n3090, ya ha sido incorporado en el FCD. De todos modos, para ser completo, podría mencionar que las referencias también pueden referirse a funciones. +1 para precisión técnica :) –

+0

Perdón por reanudar una publicación anterior. ¿Significa que en C++ 11/14/17 puedo usar con seguridad el término "variable de referencia" cuando hablo de 'int & b = a'? –

+0

Dado que C++ 11, * variable * significa referencia u objeto. Ver [básico]/6 en C++ 14 por ejemplo: "A * variable * es introducida por la declaración de una referencia que no sea un miembro de datos no estático o de un objeto. El nombre de la variable, si lo hay, denota la referencia u objeto" –

12

Una variable de referencia proporciona un alias (nombre alternativo) para una variable definida previamente. Por ejemplo:

float total=100; 
float &sum = total; 

Significa tanto total y sum son las mismas variables.

cout<< total; 
cout << sum; 

Ambos van a dar el mismo valor, 100. Aquí el operador & no es el operador de dirección; float & significa una referencia a flotación.

0

una variable referencia y una variable puntero son exactamente lo mismo para la máquina (el compilador generará el mismo código de máquina).

Las ventajas más evidentes de la utilización de una variable de referencia a través de una variable de puntero en mi conocimiento:

  1. Fácil de entender (sin dirección, de-referencia de todo tipo de cosas dolor de cabeza)
  2. le ahorra un poquito de tipeando, y probablemente también menos propenso a errores.

En el siguiente código, el lado izquierdo está utilizando una variable de referencia, y el lado derecho está utilizando una variable de puntero. Son lo mismo para la máquina, pero verá que la variable de referencia de uso le ahorra un poco de tipeo.

Reference variable   Pointer variable 
int a = 1;   ~~~~~~ int a = 1; 
int &b = a;  ~~~~~~ int *b = &a; 
b = 2;    ~~~~~~ *b = 2; 
cout << a << '\n' ~~~~~~ cout << a << '\n' 
============================================== 
2     ~~~~~~ 2 
1

Una referencia es una etiqueta alternativa, un alias, para el objeto con el que se inicializa. Una vez que se inicializa una referencia, no se puede cambiar para que sea una etiqueta alternativa o alias de algún otro objeto. Después de la inicialización, la referencia o la variable de objeto se pueden usar indistintamente.

Una referencia tiene algunas de las características de un puntero const para un objeto en el sentido de que se inicializa cuando se define. Y aunque se puede cambiar lo que hace referencia o señala, la referencia o el puntero const no se pueden cambiar. Sin embargo, dado que una referencia es una etiqueta alternativa o un alias, puede o no existir realmente como un objeto de datos a diferencia de un puntero de const que probablemente existirá a menos que el compilador pueda optimizarlo. E incluso si el compilador crea una referencia como una entidad real, esa es la limpieza del compilador y debe ignorarse, ya que oficialmente no existe como el hombre detrás de la cortina en la Ciudad Esmeralda.

Los siguientes ejemplos de código da ejemplos comparando y contrastando con la referencia de puntero y el puntero const:

int myInt;   // create a variable of type int, value not initialized 
int myInt2 = 3;  // create a second variable of type int with a value of 3 
int &rInt = myInt; // create a reference to the variable of type int, myInt 

rInt = 5;   // myInt now has a value of 5, the reference is an alias for myInt 
rInt++;    // myInt now has a value of 6, the reference is an alias for myInt 
rInt = myInt2;  // myInt now has the same value as myInt2, a value of 3 
int *pInt = &rInt; // pInt points to myInt 
(*pInt)++;   // increments myInt 
pInt++;    // increments the pointer which formerly pointed to myInt 

int &rInt2;   // error C2530: 'rInt2' : references must be initialized 
int *pInt2;   // just fine, uninitialized pointer is ok 
int * const pInt3; // error C2734: 'pInt3' : const object must be initialized if not extern 
int * const pInt4 = &myInt; // define and initialize const pointer 
pInt4 = &myInt2;  // error C3892: 'pInt4' : you cannot assign to a variable that is const 

En realidad, hay dos tipos de referencias: una referencia lvalue y una referencia rvalue.

Una referencia lvalue es la misma referencia en el lenguaje C++ antes de C++ 11. Se introdujo una referencia rvalue en C++ 11 para permitir una referencia a un objeto temporal para ayudar a hacer un movimiento en lugar de una copia y algunas otras acciones donde una copia es el enfoque incorrecto pero un movimiento es el enfoque correcto.

Por ejemplo, una comparación de referencia lvalue y referencia rvalue en las siguientes líneas de fuente simples. Debido a que estas son referencias int, significa que una asignación de un valor no entero da como resultado que el compilador realice una conversión que da como resultado una variable temporal. Una referencia rvalue se puede vincular a una variable temporal y una referencia lvalue no.

// assign a double to an int causing creation of temporary  
int &rIntd1 = 1.2; // error C2440: 'initializing' : cannot convert from 'double' to 'int &' 
int &&rIntd2 = 1.2; // warning C4244: 'initializing' : conversion from 'double' to 'int', possible loss of data 

rInt = rIntd2;  // myInt from the code above now has a value of 1, 1.2 was truncated when converting from double to int 
3

Una variable Referencia es un alias para la nombre de la variable.

Es diferente de los punteros en las formas siguientes:

  1. No se puede tener referencias nulas. Siempre debe ser capaz de asumir que una referencia está conectada a una pieza legítima de almacenamiento.
  2. Una vez que se inicializa una referencia a un objeto, no se puede cambiar para apuntar a ningún otro objeto, mientras que en el caso del puntero podemos hacer que apunte a cualquier otro objeto en cualquier momento.
  3. Una referencia debe inicializarse al momento de su creación. Los punteros se pueden inicializar en cualquier momento.
0

Las variables de referencia (let a), sólo decir que para una fácil comprensión, otro nombre de la variable (let x), que ocupa la misma posición de memoria exacta que la de x.

int &a = x; se refiere a que a tiene la misma ubicación de memoria que la de x.

Por ejemplo, supongamos que dos compañeros comparten la misma habitación. El nombre de uno de los amigos es x y el nombre de otro amigo es a. Si a cambia la ubicación de la tabla ubicada en la sala, desde la posición (x,y,z) a (x1,y1,z1), los cambios también serán visibles para el amigo x y viceversa.

0

Una referencia es un nombre alternativo para un objeto. Una variable de referencia proporciona un alias para las variables definidas previamente. Una declaración de referencia consiste en un tipo de base &, una variable de referencia que se equipara con un nombre de variable.

0

Página 79 ~ 80 C++ Primer 5th ed.

Objeto: una región de memoria que tiene un tipo

Variable: objeto nombrado o referencia

Referencia: Un alias para otro objeto.

Cuestiones relacionadas