You are on page 1of 35

Universidad Nacional de Ingeniera

Programa de Iniciacin Tecnolgica (PIT)


CTIC
Curso: Lenguaje C++

Prof.: Lic. Csar Martn Cruz Salazar


En donde estamos?
En la clase anterior, vimos cmo declarar clases y objetos.
Uno puede, por ejemplo declarar una instancia de la clase
Rectangle:
Rectangle rect;
Una vez que usted hizo esa declaracin, cmo inicializamos los
atributos de rect?

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 1


En donde estamos?
class Rectangle {
public:
double area() const;
double getLargo() const;
double getAncho() const;
void setLargo(double l);
void setAncho(double a);
private:
double largo;
double ancho;
};

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 2


Inicializacin de los atributos

Primera solucin: asignar individualmente un valor para cada


atributo.
Rectangle rect;
double lado;
cout << "Que largo? "; cin >> lado;
rect.setLargo(lado);
cout << "Que ancho? "; cin >> lado;
rect.setAncho(lado);

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 3


Inicializacin de los atributos

Esta es una mala solucin en el caso general:


Implica que todos los atributos son parte de la interfaz
(pblico) o van acompaados de un manipulador. Rompe la
encapsulacin.
Obliga al usuario-programador de la clase inicializar
explcitamente todos los atributos. Se corre riesgo de olvido.

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 4


Inicializacin de los atributos

Segunda solucin : Definir un mtodo dedicado a la inicializacin de


los atributos.
class Rectangle {
public:
void init(double l, double a)
{
largo= l;
ancho = a;
}
...

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 5


Inicializacin de los atributos

private:
double largo;
double ancho;
};
Para hacer las inicializaciones, existe en C++ mtodos particulares
llamados constructores.

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 6


Los Constructores
Un constructor es un mtodo:
Que se invoca automticamente con la declaracin de un
objeto.
Que es responsable de la realizacin de todos las
operaciones solicitadas en los primeros aos de vida del
objeto (incluyendo la inicializacin de atributos).

Sintaxis bsica:
NombreClase (lista_parametros)
{
/ * Inicializar atributos usando lista_parametros * /
}

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 7


Los Constructores

Ejemplo:
Rectangle(double l, double a)
{
largo = l;
ancho = a;
}

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 8


Los Constructores
Los constructores son mtodos casi como los otros. Las
diferencias son :
No hay tipo de retorno.
(tampoco void)
Tiene el mismo nombre que la clase.
Se invoca automticamente cada vez que una instancia es
creada.

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 9


Los Constructores
Como los otros mtodos :
Los constructores pueden ser sobrecargados.
Podemos dar valores por defecto a sus parmetros.
(ejemplos se van a dar a continuacin)
Una clase puede por tanto tener varios constructores, siempre y
cuando su lista de parmetros sea diferente.

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 10


Cambio en el Programa
class Rectangle {
public:
Rectangle(double l, double a)
{
largo = l;
ancho = a;
}
double area() const
{ return largo * ancho; }
private:
double largo;
double ancho;
};
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 11
Inicializacin por Constructor

La declaracin para la inicializacin de un objeto se realiza como


con una variable ordinaria.

sintaxis:
NombreClase Instancia (valor1, ..., valorN);
donde valor1, ..., valorN son los valores de argumentos pasados al
constructor.

Ejemplo:
Rectangle r1 (18.0,5.3); // Invocacin al constructor con 2 parmetros.

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 12


Nuestro programa es ahora
class Rectangle {
public:
Rectangle(double l, double a)
{
largo = l;
ancho = a;
}
// ...
private:
double largo;
double ancho;
};
int main()
{
Rectangle rect1(3.0, 4.0);
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 13
Ejercicio en C++
Ejercicio 1:
Usando un constructor desarrolle un programa en C++ que
encuentre el rea de un rectngulo.
#include <iostream>
using namespace std;
class Rectangle {
public:
Rectangle(double l, double a)
{
largo = l;
ancho = a;
}
double area() const

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 14


Ejercicio en C++
{return largo*ancho;}
// ...
private:
double largo;
double ancho;
};
int main()
{
Rectangle rect1(3.0,4.0);
cout<<"area:"<<rect1.area()<<endl;
return 0;
}
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 15
Conversin usando Static_cast en
C++
Sintaxis:
static_cast < nuevo_tipo > ( expresin )
Retorna un valor del tipo nuevo_tipo.
Ejemplo:
int n = static_cast<int>(3.14);

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 16


Ejercicio en C++
Ejercicio 2:
Usando un constructor muestre el valor de una expresin
fraccionaria en la siguiente forma: 8/45=0.177778
#include <iostream>
using namespace std;
class Fraccion
{
private:
int m_nNumerador;
int m_nDenominador;
public:
Fraccion(int nNumerador, int nDenominador=1)
{

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 17


Ejercicio en C++
m_nNumerador = nNumerador;
m_nDenominador = nDenominador;
}
int GetNumerador() { return m_nNumerador; }
int GetDenominador() { return m_nDenominador; }
double GetFraccion() {return static_cast<double>(m_nNumerador) /
m_nDenominador; }
};
int main()
{
Fraccion mifraccion(8,45); // llama al constructor Fraction()
cout << mifraccion.GetNumerador() << "/" <<
mifraccion.GetDenominador();
cout << "="<<mifraccion.GetFraccion()<<endl;
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 18
Ejercicio en C++
return 0;
}
CONSTRUCCION DE ATRIBUTOS
Qu pasa si los atributos son ellos mismos objetos?
Ejemplo:
class RectangleColor {
private:
Rectangle rectangle;
Color color;
//...
};
Debemos inicializar los atributos directamente utilizando sus propios
constructores!.
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 19
Llamada a constructores de atributos
Un constructor normalmente debera contener una seccin de
llamada a constructores de atributos ....
... As como la inicializacin de atributos de tipo base.
Esto se llama "lista de inicializacin" del constructor.
Sintaxis general:
NombreClase (lista de parametros)
// Lista de inicializacin
: atributo1 (...) // llamada al constructor de atributo1
...
atributoN (...) // llamada al constructor de atributoN
{// Otras operaciones}

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 20


Llamada a constructores de atributos
Ejemplo:
class Rectangle {
Rectangle(double l, double a)
: largo(l), ancho(a);
{}
};
class RectangleColor {
RectangleColor(double l, double a, Color c)
: rectangle(l, a), color(c)
{}
private:
Rectangle rectangle;
Color color;
21
};Lic. Martn Cruz Salazar Lenguaje C++ - CTIC
Llamada a constructores de atributos
Ejercicio 3:
Considerando la nueva sintaxis de llamada a constructores de
atributos. Cambie el programa de calculo del rea de un rectngulo.
#include <iostream>
using namespace std;
class Rectangle {
public:
Rectangle(double l, double a)
: largo(l), ancho(a)
{}
double area() const
{ return largo * ancho; }

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 22


Llamada a constructores de atributos
private:
double largo;
double ancho;
};
int main()
{
Rectangle rect1(3.0,4.0);
cout<<"area:"<<rect1.area()<<endl;
return 0;
}

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 23


Constructor por defecto
El constructor por defecto es un constructor que no tiene
parmetros o que todos los parmetros tienen valores por defecto.
Ejemplo:
// El constructor por defecto
Rectangle(): largo (1.0), ancho (2.0)
{}
Otro Ejemplo:
Rectangle(double c = 1.0) : largo(c), ancho(2.0*c)
{}
Ejercicio4:
Usando un constructor por defecto calcule el rea de un
rectngulo.
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 24
Constructor por defecto
#include <iostream>
using namespace std;
class Rectangle {
public:
Rectangle():largo(3.0), ancho(4.0)
{}
double area() const
{ return largo * ancho; }
private:
double largo;
double ancho;
};
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 25
Constructor por defecto

int main()
{
Rectangle rect1;
cout<<"area : "<<rect1.area()<<endl;
return 0;
}

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 26


El Destructor
Si la inicializacin de atributos de una instancia implica la
movilizacin de recursos, como archivos, dispositivos, porciones de
memoria(punteros), etc.
Entonces, es importante liberar estos recursos despus de su uso.
C++ proporciona un mtodo llamado destructor invocado
automticamente al final de la vida de la instancia.

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 27


El Destructor
La sintaxis para declarar un destructor de clase NombreClase es:
~NombreClase () {//Operaciones(liberacin)}
El destructor de una clase es un mtodo sin parmetros
+No es posible la sobrecarga.
Su nombre es el de la clase, precedido por el signo ~.
Si el destructor no ha sido definido explcitamente por el
programador, el compilador genera automticamente una versin
mnima.

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 28


El Destructor
Ejercicio:
Desea contar el nmero de instancias de una clase activa en un
momento dado del programa.
Sugerencia: Usar como contador una variable global de tipo
entero.
El constructor incrementa el contador.
El destructor lo decrementa.

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 29


Ejemplo Destructor
#include <iostream>
using namespace std;
long counter(0);//Contador inicializado en 0
class Rectangle{
public:
Rectangle(): largo(0.0), ancho(0,0){//constructor
++counter; }
~Rectangle(){//destructor
--counter;}
private:
double largo;
double ancho;
} Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 30
Ejemplo Destructor
int main()
{
Rectangle rect1;
//Contador=1
cout<<"contador:"<<counter<<endl;
Rectangle rect2;
//Contador=2
cout<<"contador:"<<counter<<endl;
return 0;
}
Ejercicio:
Desarrolle un programa usando un constructor y destructor para
encontrar el rea de un rectngulo.
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 31
Constructor de copia
C++ proporciona una forma de crear una copia de una instancia:
El Constructor de copia.
Rectangle r1(12.3,24.5);
Rectangler r2(r1);
r1 y r2 son dos objetos separados pero que tienen los mismos
valores para sus atributos (al menos inmediatamente despus de la
copia).
El constructor de copia inicializa una instancia copiando los atributos
de otra instancia del mismo tipo.
sintaxis:
NombreClase (NombreClase const&otro){...}

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 32


Constructor de copia
Ejemplo:
Rectangle(Rectangle const&otro)
:largo(otro.largo),ancho(otro.ancho)
{}
Un constructor de copia es generado automticamente por el
compilador sino se define explcitamente (por defecto constructor
de copia)
Este constructor opera una inicializacin miembro a miembro de
los atributos.

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 33


Constructor de copia
Ejercicio :
Usando un constructor de copia encuentre la cuenta de instancias
de una clase activa.

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 34

You might also like