una - se utilizo la variable local sin inicializar c++
¿Por qué separar la definición de variable y la inicialización en C++? (8)
Actualmente estoy trabajando en un código C ++ bastante antiguo y a menudo encuentro cosas como
int i;
i = 42;
o
Object* someObject = NULL;
someObject = new Object();
o incluso
Object someObject;
someObject = getTheObject();
Entiendo completamente lo que hace este código, pero realmente no tengo idea de cuándo podría ser útil una separación de este tipo entre definición de variables e inicialización. Busqué algunas explicaciones, pero siempre terminé con las listas de inicialización de miembros o con la pregunta cuando debería definir sus variables locales.
Al final, no entiendo la razón por la cual alguien pudo haber escrito este código intencionalmente. Simplemente divide la definición y la inicialización en dos líneas subsiguientes y genera una sobrecarga: en el último caso, crea un objeto utilizando el constructor predeterminado solo para destruirlo en la siguiente línea.
Me pregunto si debería simplemente cambiar el código a
int i = 42;
Object* someObject = new Object();
Object someObject = getTheObject();
¿Podría esto llevar a algún problema?
¿Por qué separar la definición de variable y la inicialización en C ++?
No has separado la definición y la inicialización. Acaba de asignar la variable / objeto (a algún valor en particular) en su fragmento de código. Así que el título es engañoso.
Object someObject;
someObject = getTheObject();
es bastante diferente de Object someObject = getTheObject();
someObject = getTheObject();
invoca el operador de asignación de la clase Object
mientras que en Object someObject = getTheObject();
Copiar el constructor de la clase se invoca. Esto también se conoce por la inicialización de copia de nombre
Un buen compilador podría generar el mismo código en caso de int i; i = 42;
int i; i = 42;
e int i =42
. No habrá mucha sobrecarga.
Por cierto, siempre prefiero int i = 42
a int i; i=42
int i; i=42
y
Object someObject = getTheObject();
a
Object someObject; someObject = getTheObject();
PS: int i = 42
define e inicializa i
mientras que int i; i=42
int i; i=42
define i
y luego le asigna 42
.
¡El cambio que propones es altamente recomendado! Esto es parte de un lenguaje importante en la programación en C ++, a saber, la adquisición de recursos es la inicialización .
Considere el siguiente caso:
SomeType object;
if( whateverCondition ) {
object = getObjectOneWay();
} else {
object = getObjectAnotherWay();
}
De esta manera queda claro que ambas ramas asignan la variable y su valor inicial es irrelevante. Sin embargo, rara vez vale la pena.
En C, existe la restricción de que tiene que definir sus variables en la parte superior del bloque de código, incluso si solo las necesita en algún lugar más adelante en la función. Así que en los viejos tiempos de C, las personas a menudo definían primero todas sus variables y luego pensaban en los valores que deberían tener.
Como usted dice que es un código C ++ bastante antiguo, podría usar esa misma convención como un remanente de las prácticas de C.
Sin embargo, no hay una razón real para hacer esto en C ++. Mejor siempre define tus variables donde puedes inicializarlas directamente.
No. Es una cuestión de estilo.
Sin embargo, si alguna vez quiso mover la declaración fuera de la función, sería menos de edición si la declaración y la inicialización estuvieran separadas.
Hay una buena razón técnica en el hardware basado en ROM, NO es un problema de estilo:
En los sistemas integrados basados en ROM / EEPROM, esto tiene un efecto sobre dónde se escribe el valor en el binario. Las variables sin inicializar se escriben en .bss, mientras que las variables inicializadas se escriben en .data. La inicialización prematura aumentará el espacio de la ROM, lo que en los sistemas integrados más antiguos puede causarle grandes problemas. Si está ejecutando en un sistema con una ROM pequeña, puede quedarse sin memoria si inicializa innecesariamente. Algunos compiladores ridículos incluso se dirigirán directamente a la ROM, haciendo que estos valores sean de solo lectura si no tiene cuidado.
Por ejemplo, consulte este ejemplo de GameBoy para obtener una explicación más completa: http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_varinit
Object someObject;
someObject = getTheObject();
Esto utiliza el operador de asignación.
Object someObject = getTheObject();
Esto utiliza el constructor de copia.
Aparte de eso, tus cambios sugeridos son equivalentes, y debes implementarlos. Se espera que la diferencia de operador de ctor / asignación de copia produzca el mismo resultado, aunque el idioma no lo impone.
No veo ninguna razón válida para dividir la declaración y la asignación como lo hace el código original, aunque a todos los efectos prácticos no introduce gastos generales (excepto para el objeto)
int i;
i = 42;
Eso no es definición de variable separada e inicialización .
Esa es la declaración de variable separada y la asignación . No veo ninguna razón para esto. Si conoce el valor en el momento de la declaración de la variable, inicialícelo en ese momento. Así que tu pregunta no tiene ninguna explicación racional.
Por supuesto, si no conoce el valor en el momento de la declaración, entonces no tiene ninguna opción, entonces necesita asignación .