Programación orientada a
objetos II
Curso INEM. Programación en C++
Santiago Muelas Pascual
[email protected]
Repaso de conceptos
! Clase
! Objeto
! Atributos
! Métodos
! Cambio de enfoque
! Constructor
! Creación de un objeto
! Declaración/Definición
! Destructor
! Get/Set
int cuenta; ingresa(cuenta,500);!
Cuenta micuenta; micuenta.ingresa(500);!
Ocultación de la información
Cohesión y acoplamiento
! El acceso directo a tributos no es recomendable porque revela
la estructura interna del objeto
! Los métodos definen cómo se debe usar un objeto
! Permitir el acceso a los atributos es dar “vía libre” a manipular
su estado sin control
! Nos limita la posibilidad de modificar la implementación
! En su lugar se deben definir métodos que, de forma genérica,
modifiquen el estado de acuerdo a consideraciones
semánticas
! Se debe prohibir el acceso a los atributos
! Modificadores de la visibilidad
! Cohesión: Grado de relación entre las diferentes características de
un objeto
! Objeto con una función muy bien definida: muy cohesionado
! Objeto con muchas funciones no relacionadas: poco cohesionado
! Acoplamiento: Grado de dependencia entre los diferentes objetos
! Programa en el que todas las clases tienen funciones distintas y
definidas: Poco acoplado
! Programa en el que todas las clases participan en todas las tareas
Muy acoplado
! Se debe maximizar la cohesión de cada objeto y minimizar el
acoplamiento entre clases distintas
6/20/11
1
Estilos de declaración de clases:
struct y class
class Perro!
{!
char inicial;!
int edad;!
Perro(int an);!
…!
};!
struct Perro!
{!
char inicial;!
int edad;!
Perro(int an);!
…!
};!
Los miembros por defecto
son privados
Los miembros por defecto
son públicos
El puntero this
! Dentro de un método, la palabra reservada this representa al
puntero implícito al objeto actual.
! Lo pasa el compilador como el primer argumento implícito
de cada llamada de un método
! Se utiliza implícitamente para hacer referencia tanto a los
atributos como a los métodos
! También se puede utilizar de manera explícita
El puntero this
El puntero this
! Para hacer llamadas encadenadas
…!
Rectangulo& miRect(1,1,2,3);!
miRect.traslada(2,3).aumenta(2);!
Perro.h
class Perro !
{!
int anyos;!
public:!
Perro(int an);!
…!
};!
Perro.cpp
#include “Perro.h”!
Perro::Perro(int anyos) !
{!
(*this).anyos = anyos!
// o también!
this->anyos = anyos;!
}!
…!
!
6/20/11
2
6/20/11
Clases y const
Atributos const
! Control extra para evitar que un objeto pueda modificarse
! Se puede aplicar a:
! Atributos
! Métodos
! Objetos
! Sólo se pueden inicializar y no se pueden modificar
class Contenedor !
{!
const int maxSize_;!
Contenedor(int maxSize);!
}!
! ¿Cómo controla el compilador que sólo se pueda inicializar una vez?
! Lista de inicialización del constructor
Lista de inicialización del
constructor
! Desarrollada originalmente para el uso con herencia
! Se verá más adelante
! Sólo ocurre en el constructor
! Permite que se establezca un valor en el momento de creación de
los atributos
! Si no, en el constructor tendrían un valor indeterminado
Perro::Perro(int ed) !
{!
// Aquí edad tiene un valor determinado!
edad = ed;!
}!
Lista de inicialización del
constructor
! Sólo en la definición del constructor
! Antes de la primera {
! Cada atributo se inicializa con el valor determinado entre los
paréntesis
! Si hay más de un atributo, se separa con comas
Constructor(int par, int par2) : atrib1(par1), atrib2(par2)
{ …}
3
6/20/11
Métodos const
! No pueden alterar el estado de ningún atributo
! ¿Qué tipo de métodos que hemos visto deberían llevar const?
! Métodos get, imprime, …
! Llevan el modificador const al final de su declaración
! Y definición!!!!!
Lista de inicialización del
constructor
Perro::Perro(int ed) : edad(ed)!
{!
}!
Contenedor::Contenedor(int maxSize) : maxSize_(maxSize)!
{!
}!
Métodos const
Métodos const
Perro.h!
…!
int getEdad() const;!
…!
Perro.cpp!
…!
int Perro::getEdad() const {!
return edad;!
}!
Perro.h!
…!
int getEdad() const;!
…!
Perro.cpp!
…!
int Perro::getEdad() const {!
edad = 2; // ¿Qué pasa?!
return edad;!
}!
4
Objetos const
Constructor copia
! Evita que se modifique el estado de un objeto
! Sólo se permite invocar métodos const sobre este objeto
int main() !
{!
const Perro miPerro(2);!
cout << miPerro.getEdad() << endl;!
miPerro.setEdad(2); // ¿Qué pasa?!
}!
! ¿Tipos de paso de parámetros?
! Por valor y por referencia
! ¿Qué pasa en el paso por valor?
! Ej: int a=2; miFuncion(a);
! ¿Y qué pasa con una función que recibe/devuelve un objeto?
! Ej: miPancho(2); vetenerinario.anyade(miPancho)
Constructor copia
Constructor copia
! El constructor copia se llama automáticamente cuando se
pasa/devuelve un objeto de una función
! O cuando se crea un objeto con otro como parámetro
! Perro miPancho2(miPancho);
! El compilador genera uno por defecto si no se define
! Hace una copia de todos los atributos
! Podemos redefinirlo
! Ej: Para hacer copias del contenido apuntado por variables de
tipo puntero
class Perro!
{!
int edad;!
Perro(int ed);!
Perro::Perro(int ed) !
{!
edad = an;!
}!
Perro(const Perro &otro);!
Perro(const Perro &otro)!
…!
};!
{!
edad = otro.edad;!
}!
!
6/20/11
5
Constructor copia
Valores por defecto
! ¿Qué pasa si lo declaro private?
! Prohíbo el paso por valor
! Permite asignar argumentos por defecto u omisión a
parámetros
! Es un valor dado en la declaración de un parámetro de un
método que permite al compilador insertar automáticamente
ese valor cuando no se incluya en la llamada
Recordatorio: Constructor
Valores por defecto
! Existe sobrecarga (distintos parámetros)
class Perro !
{!
#include “Perro.h”!
Perro::Perro(int an) !
enum Color {MARRON, NEGRO};!
{!
int anyos;!
Color color;!
public:!
Perro(int an);!
Perro(int an, Color col); !
…!
};!
anyos = an;!
color = MARRON;!
}!
Perro::Perro(int an, Color col) {!
anyos = an;!
color = col;!
}!
!
! Se está repitiendo la mayor parte del código de los
constructores
! Los valores por defecto nos permiten evitar este tipo de
redundancia
…!
Perro(int an, Color col=MARRON); !
// Me permite llamar!
Perro(2); //automáticamente me inserta MARRON!
Perro(2,NEGRO);!
6/20/11
6
Valores por defecto
Valores por defecto
class Perro !
{!
enum Color {MARRON, NEGRO};!
#include “Perro.h”!
!
Perro::Perro(int an, Color col) {!
int anyos;!
Color color;!
public:!
Perro(int an, Color col=MARRON); !
…!
};!
anyos = an;!
color = col;!
}!
!
! Son una ayuda del lenguaje
! De la misma manera que la sobrecarga de métodos
! Ambos métodos permiten utilizar un mismo nombre para
situaciones distintas
! Si los métodos tienen comportamientos muy distintos
! Sobrecarga de métodos
Valores por defecto
Atributos estáticos o de clase
! Limitaciones/Restricciones:
! Sólo los últimos parámetros pueden ser asignados de esta
manera
! No puedo tener un parámetro por defecto seguido de uno que no lo
es Perro(int edad=2,Color color) // ERROR
! Al realizar todos los parámetros que omita tendrán valores por
defecto
Perro(int edad=2, Color color=MARRON, int id=3);
Perro(4); // color valdrá MARRON e id 3
! ¡Sólo se pueden usar al declarar el método!
! Compartidos por todos los objetos
! Similares a las variables globales pero con ámbito de clase
! Representa información intrínseca de la clase
! Existen incluso cuando no existen objetos de esa clase
! Comienza con la palabra reservada static
! La definición tiene que existir y además tiene que estar fuera
de la declaración de la clase
6/20/11
7
6/20/11
Atributos estáticos o de clase
Atributos estáticos o de clase
class Perro !
{!
public:!
int Perro::numPerros=0;!
Perro::Perro(){!
numPerros+=1;!
static int numPerros;!
}!
Perro(); !
};!
int main() {!
Perro miPancho, miPancho2;!
cout << Perro::numPerros;!
}!
!
! Pueden tener visiblidad public, private y protected
! Se inicializan una sola vez
! Uso típico
! Controlar el número de objetos que se han creado
! Constantes de una clase
! ¿Cómo?
static const PI = 3.14;
!
! La definición va incluida en la declaración
Métodos estáticos o de clase
Métodos estáticos o de clase
! Accede solamente a atributos y métodos estáticos
! Tienen el modificador static delante de la declaración del
método
! Se invocan o bien dentro de un método o por medio del
identificador de clase
! No tienen apuntador this
class Perro !
{!
static int numPerros;!
public:!
static int getNumPerros();!
Perro(); !
};!
int Perro::numPerros=0;!
Perro::Perro(){!
numPerros+=1;!
}!
int Perro::getNumPerros(){!
return numPerros;!
}!
int main() {!
Perro miPancho, miPancho2;!
cout << Perro::getNumPerros();!
}!
!
8
Resumen: Atributos y variables
Funciones inline
! Atributo de instancia: Definido para las instancias de una
clase
! Una copia por objeto
! Atributo de clase: Definido para la clase
! Común para todos los objetos
! Variable local: Definida dentro del cuerpo de un método.
! De ámbito restringido
! En este tipo de funciones, el código de la función se inserta
en fase de compilación en el lugar de la llamada de la
función
! Eficiencia
Funciones inline
Funciones inline
Perro.h
class Perro !
{!
int anyos;!
public:!
int getAnyos() !
{!
return anyos;!
Comentarios de: Programación orientada a objetos II (0)
No hay comentarios