c++ - pronouns - ¿Cuál es la diferencia entre Object obj=Object() y Object obj()?
subject and object questions explicacion (4)
Gran diferencia.
El primero es un prototipo de función para una función que no toma argumentos y devuelve un Objeto.
El segundo instancia un Objeto llamando al constructor predeterminado. Para evitar dudas, no se llama al operador de asignación.
Coloque los paréntesis en el primer caso para que las declaraciones sean equivalentes.
Creo que tiene mucha información al respecto, pero no sé cómo se llama. No puedo entender la diferencia entre las siguientes dos cadenas de código:
Object obj();
Y
Object obj = Object();
¿Puede usted explicar por favor? O al menos decir cómo llamarlo.
Object obj();
Declara un nombre de función obj
que devuelve un Object
y no toma parámetros. Esto generalmente no es lo que quieres.
Object obj = Object();
Declara un Object
llamado obj
luego se inicializa la copia con un Object
construido por defecto temporal. Normalmente tampoco desea hacer esto, a menos que esté reiniciando un objeto a su estado predeterminado.
En general, si quieres construir sin llamar a un constructor, puedes usar
Object obj;
//or
Object obj{};
Object obj();
declara una función, no un objeto! Esta es una instancia del "Parseo más irritante".
Object obj = Object();
requiere que Object
tenga un constructor de movimiento o constructor de copia accesible (aunque el compilador podría terminar eludiendo el movimiento / copia).
Las formas simples de crear un objeto incluyen:
Object obj;
Object obj{};
Object obj();
no es una instanciación de objeto, es una declaración de una función obj
que no toma argumentos y devuelve una instancia de Object
.
Object obj;
es una default initialization
, es decir instanciación con constructor implícito (por lo tanto, constructor implícito predeterminado o constructor no explicit
definido por el usuario sin parámetros), y esta declaración llama constructores implícitos de miembros no POD Object
, y para POD-types no lo hace inicialízalos (no se pondrán a cero). Esto es correcto para los miembros de los miembros de Object
y así sucesivamente de forma recursiva.
Object obj{};
es una inicialización de lista o inicialización agregada (si Object
es un agregado). Aquellos a los que llamó de manera diferente, para las llaves vacías, el comportamiento es el mismo: todos los miembros de los tipos de POD tienen cero inicialización, y los que no son POD se inicializan por defecto.
Object obj = Object();
teóricamente es una declaración de dos pasos: 1) crear instancia temporal de Object
; 2) luego construye obj por copy constructor / move constructor / copy operator / move operator. Pero en la práctica se construirá de manera predeterminada con la idea de copiar / mover-elision (está habilitada en todos los compiladores modernos de forma predeterminada, incluso con todas las optimizaciones desactivadas, debe desactivar el elision explícitamente). Mejor no uses esta variante.
Pre-Conclusion
Escoger
Object obj;
o
Object obj{};
Elija primero si desea una inicialización rápida sin ceroificar sus miembros POD. Elija el segundo si desea asegurarse de que todos sus miembros POD serán cero después de la instanciación de Object
.
Prácticamente, antes de la primera lectura de sus miembros, ambas variantes tienen la misma velocidad en tiempo de ejecución en todos los sistemas operativos modernos.
Asi que...
Conclusión
Usar inicialización de valor:
Object obj{};
a menos que necesite un rendimiento en tiempo real en sistemas exóticos.