Constructor y destructor

Solo disponible en BuenasTareas
  • Páginas : 6 (1379 palabras )
  • Descarga(s) : 13
  • Publicado : 21 de junio de 2010
Leer documento completo
Vista previa del texto
2.- Constructores y destructores
Constructor
Ya se ha apuntado que C++ no permite crear objetos sin dar un valor inicial apropiado a todas sus variables miembro. Esto se hace por medio de unas funciones llamadas constructores, que se llaman automáticamente siempre que se crea un objeto de una clase. Se van a estudiar ahora algunas formas posibles de crear e inicializar objetos, tales como c1.Una primera manera en la que se podría hacer esto bien pudiera ser ésta:

C_Cuenta c1; // se crea el objeto
c1.Saldo = 500.0; // se da valor a sus variables miembro
c1.Interes= 10.0;

Este método, a pesar de ser correcto, viola el principio de encapsulación al manejar directamente las variables miembro. Al igual que sucede con los arrays y cadenas de caracteres, C y C++ también permitendeclarar e inicializar las variables de la siguiente manera (más compacta, que es una inicialización):
C_Cuenta c1 = { 500.0, 10.0 };
Los valores que aparecen entre las llaves son asignados a las variables miembro de la clase o estructura, en el mismo orden en que esas variables aparecen en la declaración de esa clase. De todos modos, esta forma de declarar las variables incumple también elprincipio de encapsulación, que es uno de los objetivos de la programación orientada a objetos.
El uso del constructor es tan importante que, en el caso de que el programador no defina ningún constructor para una clase, el compilador de C++ proporciona un constructor de oficio (también llamado a veces por defecto, aunque como más tarde se verá que esta terminología puede resultar confusa).
Constructorpor defecto:
Se llama constructor por defecto a un constructor que no necesita que se le pasen parámetros o argumentos para inicializar las variables miembro de la clase. Un constructor por defecto es pues un constructor que no tiene argumentos o que, si los tiene, todos sus argumentos tienen asignados un valor por defecto en la declaración del constructor. En cualquier caso, puede ser llamadosin tenerle que pasar ningún argumento.
El constructor por defecto es necesario si se quiere hacer una declaración en la forma:
C_Cuenta c1;
y también cuando se quiere crear un vector de objetos, por ejemplo en la forma:
C_Cuenta cuentas[100];
ya que en este caso se crean e inicializan múltiples objetos sin poderles pasar argumentos personalizados o propios para cada uno de ellos. Al igual quetodas las demás funciones de C++, el constructor puede tener definidos unos valores por defecto para los parámetros, que se asignen a las variables miembro de la clase. Esto es especialmente útil en el caso de que una variable miembro repita su valor para todos o casi todos los objetos de esa clase que se creen. Consideremos el ejemplo siguiente:
class C_Cuenta {
// Variables miembro
private:double Saldo; // Saldo Actual de la cuenta
double Interes; // Interés aplicado
public:
// Constructor
C_Cuenta(double unSaldo=0.0, double unInteres=0.0)
{
SetSaldo(unSaldo);
SetInteres(unInteres);
}
// Métodos
char *GetNombre()
{ return Nombre; }
double GetSaldo()
{ return Saldo; }
double GetInteres()
{ return Interes; }
void SetSaldo(double unSaldo)
{ Saldo = unSaldo; }
voidSetInteres(double unInteres)
{ Interes = unInteres; }
void Ingreso(double unaCantidad)
{ SetSaldo( GetSaldo() + unaCantidad ); }
};
void main() {
// Ya es válida la construcción sin parámetros
C_Cuenta C0; // unSaldo=0.0 y unInteres=0.0
// También es válida con un parámetro
C_Cuenta C1(10.0); // unSaldo=10.0 y unInteres=0.0
// y con dos parámetros
C_Cuenta C2(20.0, 1.0); // unSaldo=20.0y unInteres=1.0
...
}
En el ejemplo anterior se observa la utilización de un mismo constructor para crear objetos de la clase C_Cuenta de tres maneras distintas. La primera llamada al constructor se hace sin argumentos, por lo que las variables miembro tomaran los valores por defecto dados en la definición de la clase. En este caso Saldo valdrá 0 e Interes también valdrá 0.
En la segunda...
tracking img