tipos programas funciones ejemplos datos completo comandos codigos basico c++ initialization pod

programas - Inicialización por defecto en C++



manual de c++ basico (4)

Me pregunté algo esta mañana y no puedo encontrar las palabras para "buscar" correctamente:

Digamos que tengo:

struct Foo { int bar; }; struct Foo2 { int bar; Foo2() {} }; struct Foo3 { int bar; Foo3() : bar(0) {} };

Ahora si Foo2 defecto Foo , Foo2 y Foo3 :

Foo foo; Foo2 foo2; Foo3 foo3;

¿En qué caso (s) se inicializa correctamente el miembro de la bar ?

(Bueno, Foo3 obviamente lo inicializa explícitamente y solo se muestra aquí para Foo2 la diferencia con Foo2 así que la pregunta es principalmente sobre los dos primeros).

Gracias ! :)


Como la bar es un tipo incorporado, su inicialización predeterminada no estará definida para Foo1 y Foo2 . Si hubiera sido un tipo personalizado, entonces se habría llamado al constructor predeterminado, pero aquí no es el caso.

Lección: siempre inicializa tus variables.


El caso 3 es la forma correcta, con una lista de inicialización de miembros.

Ninguno de los dos primeros se inicializará correctamente, ya que no les asigna un valor inicial (exactamente como una variable que solo no está inicializada).


Para los tipos de pod, la inicialización predeterminada es cero inicialización.

Por lo tanto:

Foo() : b() {} es lo mismo que Foo() : b(0) {}

No puedo encontrar la parte respectiva del estándar C ++, pero si omite el inicializador por completo, los tipos de POD no deberían estar inicializados por defecto (a diferencia de los tipos no POD, que son).

Por lo tanto, en su caso, solo el tercer ejemplo está correctamente inicializado.


Solo foo3 estará en todos los contextos. foo2 y foo serán si son de duración estática. Tenga en cuenta que los objetos de tipo Foo se pueden inicializar en cero en otros contextos:

Foo* foo = new Foo(); // will initialize bar to 0 Foo* foox = new Foo; // will not initialize bar to 0

mientras que Foo2 no lo hará:

Foo2* foo = new Foo2(); // will not initialize bar to 0 Foo2* foox = new Foo2; // will not initialize bar to 0

esa área es complicada, la redacción cambió entre C ++ 98 y C ++ 03 y, IIRC, nuevamente con C ++ 0X, así que no dependería de ello.

Con

struct Foo4 { int bar; Foo4() : bar() {} };

La barra siempre se inicializará también.