Si no definiste un "constructor por defecto"* entonces "new Persona();" inicializará los miembros a 0. En cambio "new Persona;" y "Persona p;" no inicializarán los miembros.
Esto se hace más complicado si alguno de los miembros es a su vez una clase o struct, en tal caso es mejor definir un constructor por defecto. En GCC la regla de inicializar a 0 se mantiene, pero en MSVC los miembros ya no se inicializan a 0 si alguno de los miembros (o uno de los miembros de los miembros) tiene un constructor por defecto.
Nota: "constructor por defecto" es un constructor que puede ser llamado sin especificar parámetros, esto incluye constructores que tienen parámetros con valores predefinidos.
Este comportamiento es especialmente útil si deseas inicializar los elementos de un arreglo a 0:
// Reservando memoria sin inicializar
char* pChar = new char[10];
// Reservando memoria y además inicializando a 0:
char* pChar = new char[10]();
Ejemplo:
Código:
#include "stdio.h"
class PersonaSinConstructor
{
public:
int _edad;
};
class PersonaConConstructor
{
public:
PersonaConConstructor() : _edad(100)
{
};
int _edad;
};
int main(int argc, char** args)
{
PersonaConConstructor* pA = new PersonaConConstructor;
PersonaConConstructor* pB = new PersonaConConstructor();
PersonaConConstructor C;
PersonaSinConstructor* pD = new PersonaSinConstructor;
PersonaSinConstructor* pE = new PersonaSinConstructor();
PersonaSinConstructor F;
printf("Edad A (Inicializado a 100): %i\n", pA->_edad);
printf("Edad B (Inicializado a 100): %i\n", pB->_edad);
printf("Edad C (Inicializado a 100): %i\n", C._edad);
printf("Edad D (Sin inicializar): %i\n", pD->_edad);
printf("Edad E (Inicializado a 0): %i\n", pE->_edad);
printf("Edad F (Sin inicializar): %i\n", F._edad);
delete pA;
delete pB;
delete pD;
delete pE;
return 0;
}