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