Ver Mensaje Individual
  #5 (permalink)  
Antiguo 02/11/2012, 15:10
Aemilius
 
Fecha de Ingreso: diciembre-2010
Mensajes: 20
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Duda con los constructores

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;
}

Última edición por Aemilius; 02/11/2012 a las 16:38