¿Se puede declarar el miembro de referencia de C++ sin inicializarse con la declaración?

Para muchos lectores, esto puede parecer lo mismo, es decir, 
 

class_type *var = NULL;
*var = &some_work;

is same as

class_type *var = &some_work;

Pero en realidad, no lo es. Cuando la declaración y la inicialización se realizan en el mismo paso, el compilador llama al constructor de copia, mientras que si se hace en otro paso, el compilador llama al constructor predeterminado.
Para entender esto, consideremos un ejemplo:
Ejemplo 1: Cuando la inicialización no se realiza en el mismo paso de la declaración 
 

CPP

#include <iostream>
using namespace std;
 
class A {
    int& p;
 
    // Note:basically it is
    // supposed to be an error
    // because this reference
    // member p is not initialized
    // with some variable at the same
    // step of its declaration. But it
    // will run in this case. For us,
    // this is the declaration but
    // not for compiler
 
public:
 
    // this line
    // means int &p=w, so p and w
    // both are same. Compiler considers
    // this step as declaration and
    // initialization is done at
    // same step.
    A(int w): p(w)
    {
        cout << p;
    }
};
int main()
{
    A obj(10);
    return 0;
}

Producción: 
 

10

Ejemplo 2: cuando la inicialización se realiza con la declaración 
 

CPP

#include <iostream>
using namespace std;
 
class A {
    int& p;
 
public:
 
    // In this step,
    // compiler will see only
    // declaration not initialization.
    // Therefore this code will
    // give an error.
    A(int w)
    {
        p = w;
        cout << p;
    }
};
int main()
{
    A obj(10);
    return 0;
}

Errores de compilación: 
 

prog.cpp: In constructor 'A::A(int)':
prog.cpp:8:5: error: uninitialized reference member in 'int&' [-fpermissive]
     A(int w)
     ^
prog.cpp:5:10: note: 'int& A::p' should be initialized
     int& p;
          ^

Nota: en este código, tan pronto como se crea un objeto, el compilador asignará memoria a p ejecutando el constructor de la clase A. Ahora, como sabemos, la variable de referencia debe inicializarse en el mismo paso, por lo que aparecerá un mensaje de error llamado «miembro de referencia no está inicializado» . 
Como hemos visto en el código 1, la inicialización no se realiza en el mismo paso de la declaración, pero aún así, nuestro código se ejecuta. Pero, en general, es una regla que «el miembro de referencia debe inicializarse y declararse en el mismo paso «.
Entonces, la respuesta a la pregunta anterior es sí y no.
 

Publicación traducida automáticamente

Artículo escrito por AnshulVaidya y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *