2010-08-05 12 views
5

Escuché que las referencias en C++ pueden ser integradas una sola vez, pero esto me da 1 es mi resultado y no devuelve ningún error.referencias en C++ problema

struct f { 
    f(int& g) : h(g) { 
    h = 1; 
    } 

    ~f() { 
    h = 2; 
    } 

    int& h; 
}; 

int i() { 
    int j = 3; 
    f k(j); 
    return j; 
} 
+0

No sabía que las estructuras se pueden usar de la misma manera que las clases en C++. Buena pregunta ... – Nils

+1

Nils: la única diferencia entre una estructura y una clase en C++ es la accesibilidad predeterminada. Para las clases, el valor predeterminado es privado, pero para las estructuras el valor predeterminado es público. Para compatibilidad con C, me parece ... – harald

+0

No es un problema de referencia, sino de alcance y vida útil del objeto. –

Respuesta

9

El destructor de f se invoca después de capturar el valor de retorno j.

Es posible que desee algo como esto, si desea ser j 2:

int i() 
{ 
    int j=3; 
    { 
     f k(j); 
    } 
    return j; 
} 

Ver C++ destructor & function call order para una descripción más detallada de la orden de destrucción y de la instrucción de retorno.

5

Aún está inicializando la referencia una sola vez; asignación e inicialización no son lo mismo. La inicialización configura h para que haga referencia a j (que nunca cambiará). Su asignación simplemente cambia el valor de j que es lo mismo que h, pero no causa que h haga referencia a una variable diferente.

+0

genial. Muchas gracias. – brett

0

Espero que este código sea solo para mostrar el problema, almacenar una referencia a una variable definida fuera de la clase es muy peligroso ya que su clase no tiene ningún control (o conocimiento) cuando la variable referenciada se apaga de alcance