Download - Informática II
4
Contenido
Informática II 2011/2
Programación orientada aobjetos - POO1
Clases y Objetos2
Punteros y Referencias3
Manejo de errores4
6
Programación orientada a objetos - POO
• El mundo real esta compuesto por elementos complejos, difícilmente pueden ser modelados por números simples o caracteres.
• La esencia de la POO es
modelar objetos (cosas o conceptos)
en vez de datos.
Informática II 2011/2
Informática II 2011/27
Programación Orientada a Objetos
•Propuesta de programación que se basa en la creación de objetos y la cooperación entre los mismos.
Def
inic
ión
•Herencia
•Abstracción
•Polimorfismo
•Encapsulamiento.
Car
acte
ríst
icas
8
Programación Orientada a Objetos
Informática II 2011/2
•Es la creación de nuevas clases partiendo de una jerarquía de clases ya existente. Mecanismo fundamental para implementar la reutilización
Herencia
• Caraterísticas•C
onsiste en aislar un objeto (sistema modular).
Abstracción
•Capacidad que puede ser implementada en las clases la cual permite utilizar un mismo método de forma diferente
Polimorfismo
•Ocultamiento de los atributos de un objeto. Sólo es posible cambiarlos mediante las operaciones definidas para ese objeto
Encapsulamiento
9
Contenido
Informática II 2011/2
Programación orientada aobjetos - POO1
Clases y Objetos2
Punteros y Referencias3
Manejo de errores4
10
Clases
Las clases son simplemente una colección de variables (usualmente de diferentes tipos), combinados con un conjunto de funciones.
La base de la encapsulación.
Las clases son capaces de encapsular todo tipo de variables, incluso otras clases.
Las clases tienen variables miembro y funciones miembro.
Informática II 2011/2
11
Clases
• Son las variables de la clase, ej. int ruedas, float altura, etc...
Variables o datos miembro:
• Son las acciones que las clases pueden realizar, ej. Maullar, correr, volar, etc..
Funciones miembro o métodos:
Informática II 2011/2
Los miembros de una clase puede ser catalogados como públicos o privados.
12
Cómo acceder a los miembros de una clase?• Los miembros de una clase pueden
accederse cuando existe un objeto definido como dicha clase, y se accede utilizando el operador punto (.)
Gato Tom;
Tom.Maullar();
• ¡Cuidado!, no trate de asignar valores a las
clases, los únicos que pueden tener valores
son los objetos.
Informática II 2011/2
13
Métodos de las clases
• La declaración e implementación de los métodos de una clase es prácticamente igual a la definición de una función regular.class Gato
{
public:
int ObtenerEdad(); //declaración del método
private:
int suEdad;
}
//Implementación del método
int Gato::ObtenerEdad() //Operador SCOPE ::{
return suEdad;
}
Informática II 2011/2
14
Métodos de las clases// Declaracion de una clase
class Rectangulo {
// Variables de instancia
int ancho, alto;
public:
// Metodos
void set_values(int a, int b);
int area();
}; // Fin de clase Rectangulo
Informática II 2011/2
void Rectangulo::set_values(int a, int b) { ancho = a; alto = b;
}
int Rectangulo::area() { return ancho*alto;
}
15
Constructores y destructores
• Los constructores y destructores son métodos especiales de las clases, usados para inicializar y liberar la memoria de las clases respectivamente:
Informática II 2011/2
class Gato{Public: Gato(); //Declaración de un constructor ~Gato(); //Declaración de un destructor}
16
Constructores y destructores
• Los constructores pueden tomar parámetros de entrada, los destructores ¡NO!
• Es una buena práctica declarar los destructores, si se declaran los constructores.
Informática II 2011/2
17
Operador Scope (::)
Permite el acceso a una variable global aunque exista una variable local con el mismo nombre. El uso de :: delante del nombre de la variable, indica al compilador que debe utilizar la variable global, en lugar de la local
También Se usa para indicar pertenencia.
Informática II 2011/2
18
Función inline• C++ permite sustituir, en tiempo de compilación, la
llamada a una función por el código correspondiente en el punto en que se realiza la llamada. De esta manera la ejecución es más rápida, pues no se pierde tiempo transfiriendo el control y realizando conversiones de parámetros.
• Como contrapartida, el programa resultante ocupa más memoria, pues es posible que el código de una misma función se introduzca muchas veces. Las funciones inline son muy útiles en el caso de funciones cortas, que se ejecutan muchas veces (en un bucle for, por ejemplo).
Informática II 2011/2
19
Espacios nombres (namespace)
1 •Un espacio de nombres es un contexto en el que un grupo de uno o más identificadores pueden existir.
2 •Un identificador definido en un espacio de nombres está asociado con ese espacio de nombres.
3 •El mismo identificador puede independientemente ser definido en múltiples espacios de nombres
Informática II 2011/2
20
Resumen:
Informática II 2011/2
• Definición de los atributos y comportamiento de un tipo de objeto concreto.
Clase
• Conceptos:
• Es la instanciación de una clase.Objeto
• Son las propiedades que posee cada uno de los objetosAtributos
• Son cada uno de las funciones (comportamiento) de un objeto.Métodos
Informática II 2011/221
Estructura de un Programa
INICIO
FIN
Declaración de variables
Acciones del Algoritmo
Encabezados
Directivas
//Mi primer programa en C++#include <iostream>using namespace std;
int main(void){
int a, b, c = 0;
cout << “Digite el primer numero: ”; cin >> a; cout << “Digite el segundo numero: ”); cin >> b; c = a + b; cout << “El resultado es: << c <<‘\n’; return 0; }
Locales-Automaticas
Una variable local se declara dentro de una función, son visibles solo dentro de la funcion
Ocultan a las variables globales con el mismo nombre.
“Nacen” y “mueren” con la función. A no ser que se declaren (static)
Variables
• Es posible crear arreglos de tantas dimensiones como requieran sus aplicaciones.•Se declaran siguiendo el patrón de la declaración de un vector:
tipo nombre [d1] [d2] [d3]… [dN];
Arreglos
Informática II 2011/223
int matrizA [2] [3] [3]={ {{1,3,5}, {7,9,11}}, {{2,4,6}, {8,10,12}},
{{3,7,11}, {15,19,23}} };
Fila 0 Fila 1
1 3 5
7 9 11
Bloque 0
Bloque 1
Bloque 2
2 4 6
8 10 12
3 7 11
15 19 23
F0
F1
C0 C1 C2 C0 C1 C2 C0 C1 C2
Bloque 0 Bloque 1 Bloque 2
Arreglos
Informática II 2011/224
1. Arreglos como parámetros a funciones
tipoRetorno funcion (tipoDato vector[]);
funcion (nombreVector);
tipoRetorno funcion (tipoDato vector[], int size);
funcion (nombreVector, tamaño);
Arreglos
Informática II 2011/225
struct nombreDeLaEstructura{ tipoDeDatoMiembro1 nombreMiembro1; tipoDeDatoMiembro2 nombreMiembro2; ... tipoDeDatoMiembroN nombreMiembroN;} ;
Con la declaración de un estructura estamos creando un tipo de datos NUEVO y PERSONALIZADO. Se utiliza la palabra clave struct
Estructuras
Cuando declaramos una estructura SOLO se está diciendo que forma tendrá, SE CREA UN NUEVO TIPO DE DATOS.
struct cdsMusica{ char titulo[40]; char artista[40]; char genero[15]; int numCanciones; int lanzamiento; int precio;};
struct cdsMusica cd1, cd2, cd3;
Falta instanciar la estructura o simplemente reservarle un espacio en memoria con un nombre especifico, SE DECLARA UNA VARIABLE DE ESTE NUEVO TIPO.
Estructuras
Estructuras
Si queremos a un elemento especifico dentro de una variable estructura se puede acceder por medio
del operador “.” ó “->”.
nombreVarEstructura.nombreMiembro = dato;
CADA MIEMBRO de una variable estructura se maneja como si fuera otra VARIABLE COMÚN Y CORRIENTE.
29
Contenido
Informática II 2011/2
Programación orientada aobjetos - POO1
Clases y Objetos2
Punteros y Referencias3
Manejo de errores4
30
• Es un tipo de variable implementada para almacenar exclusivamente direcciones de otras variables, estos se debe declarar y definir de acuerdo al tipo de dato que apunta.
Informática II 2011/2
Utilizando punteros un programa puede realizar muchas tareas que no sería posible utilizando tipos de datos estándar.
Punteros
El tipo de variable que almacena una dirección se denomina puntero.
• Un puntero es una variable como cualquier otra. Excepto que solo puede almacenar direcciones de otras variables común y corrientes.
• Un puntero apunta a una variable en memoria.• Son útiles para pasar y regresar valores a la rutina que
las llama.• Si son usadas incorrectamente se pueden convertir en
fuente de fallas y frustraciones.
Características de un apuntador
Informática II 2011/2
32
Punteros
Informática II 2011/2
Los punteros siempre deben inicializarse.
Aquellos punteros que son inicializados con un valor igual a cero (0), se denominan punteros NULL.
Se utiliza la palabra reservada VOID en la declaración de apuntadores, cuando se quiere que el puntero pueda apuntar a cualquier tipo de variables, int , char, float,….
Aquellos punteros que no sean inicializados a ningún valor se denominan “wild pointer”, y son extremadamente peligrosos pues pueden estar apuntando a cualquier cosa.
33
Violación de seguridad de la memoria
“Dangling pointer”
Un objeto apuntado se suprime sin modificar el puntero
Si se reasigna ese espacio libre en memoria, el puntero referenciará la
nueva variable (allocate),.
Informática II 2011/2
Generan corrupción de datos y posiblemente fallos de segmentación.
34
¿Para que se usan los punteros?
Ж •Manipular datos en el Free store (Heap).
Ж •Acceder a las variables miembro y métodos de un objeto.
Ж •Pasar variables por referencia a las funciones
Ж •Gestionar y administrar datos en memoria.
Ж •El utilizar punteros como valor de retorno permite superar la limitación de las funciones de devolver un único valor.
Informática II 2011/2
1000
1001
1002
1003
1004
1005
cout << " Dir y= " << &y << endl; / * visualiza dirección de y * /
cout << " y= " << y << endl; / * visualiza el valor de y * / cout << " y= " << y << endl; / * visualiza el valor de y * /
cout << " Dir y= " << &y << endl; / * visualiza dirección de y * /
Variables y memoria MEMORIA
25
77
1000
1001
1002
y
1003
1004
z
1005
#include <iostream>using namespace std;void main(){
}
int y = 25;int z=77;int y = 25;int z=77;
y = 25y = 25&y = 1002
Informática II 2011/2
36
Modo de almacenamiento• El modo de almacenamiento (storage class) es otra característica de las
variables de C++ que determina cuándo se crea una variable, cuándo deja de existir y desde dónde se puede acceder a ella.
Informática II 2011/2
•Es creada al comenzar a ejecutarse un bloque de código y deja de existir cuando el bloque se termina de ejecutar. (Por defecto)
Auto
•Estas variables existen durante toda la ejecución del programa. Una variable extern es definida o creada el momento en el que se le reserva memoria.•permiten transmitir valores entre distintas funciones y ficheros
Extern
•static se declaran dentro de un bloque como las auto, pero permanecen en memoria durante toda la ejecución del programa como las extern. La inicialización sólo se realiza la primera vez.
Static
•Este modo es una recomendación para el compilador, con objeto de que si es posible ciertas variables sean almacenadas en los registros de la CPU y los cálculos con ellas sean más rápidos.
Register
37
Espacios de memoria
Informática II 2009/2
Segmento de código
Memoria estática
Free store (Heap)
Espacio Libre
Stack (Pila)
Reservada antes de la ejecución del programa
Permanece fija.No requiere gestión
durante la ejecución.El sistema operativo se
encarga de la reserva, recuperación y reutilización.
Se accede a un espacio en esta cada vez que se declaran Variables globales o tipo static.
Es una zona de memoria que gestiona las llamadas a funciones durante la ejecución de un programa.
Cada vez que se realiza una llamada a una función en el programa, se crea un entorno de programa que se libera cuando acaba su ejecución.
La reserva y liberación de la memoria la realiza el S.O. de forma automática durante la ejecución del programa.
Es una zona de memoria donde se reservan y se liberan “trozos” durante la ejecución de los programas según sus propias necesidades, este proceso es usualmente llamado gestión de memoria dinámica.
Optimiza el almacenamiento de datos.
38
1 •Reservar memoria.
2 •Utilizar memoria reservada.
3 •Liberar memoria reservada.
Informática II 2011/2
Gestión dinámica de memoria
39
Operador new
• Un operador que reserva la cantidad de memoria deseada en tiempo de ejecución.
Informática II 2011/2
new reserva una zona de memoria en el Heap del tamaño adecuado para almacenar un dato de cualquier tipo, devolviendo la dirección de memoria donde empieza la zona reservada.
Si new no puede reservar espacio (Ej. no hay suficiente memoria disponible), se provoca una excepción y el programa termina.
La única forma de crear, modificar, acceder o eliminar una variable en el Heap es a través de un puntero.
Se puede gestionar memoria para almacenar variables de tipo predefinido (int, float, double, …) al igual que los tipos de datos creados por el usuario (estructuras, clases…).
40
Liberando la memoria del heap
• Para liberar la memoria del HEAP se usa el comando delete sobre el puntero.
delete pPuntero;
• Es MUY importante liberar la memoria del Heap, pues en caso de perder el rastro de los punteros podrán presentarse “fugas de memoria”
Informática II 2011/2
41
Operador delete
• El operador delete no elimina el puntero, simplemente lo desreferencia.
• Cuando se utiliza el operardo delete más de una vez, puede generar que el programa se estrelle, por ello es recomendable inicializar el puntero a NULL, haciendo esto se garantiza mayor seguridad, y de este modo se puede volver a reutilizar el puntero.
Informática II 2011/2
int *ptr =new int; //reserva memoriadelete ptr; //desreferncia ptrptr=NULL; //lo lleva a NULLdelete ptr; //no hay problema//se puede volver a referenciar a otro espacio de memoriaptr=new int;
42
Fugas de memoria
• Cuando “se pierde de vista” la dirección o el puntero que lleva registro del espacio en el Heap, se dice que hubo una fuga de memoria.
• La memoria desperdiciada por causa de fugas de memoria, NO podrá liberarse sino hasta que termine el programa.
Informática II 2011/2
43
Fugas de memoria
• Es muy frecuente que ocurra cuando el puntero es declarado como variable local (dentro de una función) y luego se sale de ésta sin antes liberar la memoria.
• Es muy común usar los constructores para reservar memoria en el heap y los destructores para liberarla.
• ¡OJO!, realizar un delete sobre un puntero libera la memoria, realizarlo de nuevo estrellará el programa. Para que esto no ocurra, asígnele al puntero el valor de cero DESPUÉS de hacer el primer delete.
Informática II 2011/2
44
Resumen de apuntadores
Expresión Lectura
*x Apuntado por x
&x Dirección de x
x.y Miembro y del objeto x
x->y Miembro y del objeto apuntado por x
(*x).y Miembro y del objeto apuntado por x
x[0] Primer objeto apuntado por x
x[1] Segundo objeto apuntado por x
x[n+1] Objeto (n+1) apuntado por x
Informática II 2011/2
45
Referencias
• Las referencias son “alias” de otros objetos, por lo tanto cuando se manipula una referencia, realmente se está manipulando el objeto al que ésta hace referencia.
Informática II 2011/2
46
Declaración de Referencias
int Edad = 5;
int &rVbleReferencia = Edad;
Informática II 2011/2
// int &rOtraVble = int // error!, esta mal referenciado
47
Referencias
• Las referencias difieren con otro tipo de variables ya que deben declararse inicializándolas con las variables a las que harán referencia. Si se tratan de declarar sin inicializar, el programa no compilará.
• Si se toma la dirección de una referencia (&rReferencia), el valor que devuelve es la dirección de la variable a la que apunta la referencia.
Informática II 2011/2
socio1, socio20X0FDE04
0X0FDE00
0X0FDE08
int socio1;int &socio2=socio1;
48
Referencias
• Las referencias SÓLO pueden ser asignadas una vez, por lo tanto, todas las operaciones que se hagan a la referencia, en realidad se estarán haciendo sobre el objeto al que hacen referencia.
• ¡NO TRATE DE REASIGNAR UNA REFERENCIA!
Informática II 2011/2
49
Referencias
• Las referencias pueden trabajar con todo tipo, incluso con objetos.
• Cuando una referencia hace referencia a un objeto, puede usar todos sus miembros y métodos tal y como se hace con objeto real.
Informática II 2011/2
50
Pasar y retornar valores por referencia
• A las funciones normalmente se le pasan los argumentos por valor y sólo devuelven un valor.
• Si se pasan los parámetros por referencia, se puede superar éstas limitantes. Existe dos formas de hacerlo; usando punteros o referencias
• Se dice que uno pasa “por referencia” cuando usa punteros o uno pasa “una referencia” cuando usa referencias.
Informática II 2011/2
51
Pasar y retornar valores por referencia
• Cuando se pasa por referencias, realmente se pasa la dirección del objeto real (en vez del objeto entero), para luego manipular directamente el objeto, no su copia.
Informática II 2011/2
52
Retornos múltiples valores en las funciones
• Existen 2 formas de hacerlo; pasar los objetos por referencia y trabajarlos dentro de la función o haciendo lo mismo pero con los punteros.
• Estos métodos permiten que se use el valor de retorno de la función para reportar errores.
Informática II 2011/2
53
Pasar por referencia para ser más eficiente
Informática II 2011/2
• Cada vez que se pasa un objeto por valor, se genera una copia de éste en la pila, lo cual hace que se requiera tiempo y memoria.
• Cuando se trabajan con valores sencillos(int, short, etc..), es un costo tribial; sin embargo, con objetos complicados es un costo significativos.
54
Pasando punteros const
Cuando se pasa un puntero de un objeto como parámetro de una función, ocurre el riesgo de
modificar la variable y sus métodos.
Para evitar este inconveniente se pueden usar punteros a objetos constantes, con el cual sólo se
podrá usar los métodos constantes, protegiendo sus miembros.
Informática II 2011/2
55
Cuando usar referencias o punteros
Informática II 2011/2
Referencias PunterosLas referencias generan un código mas limpio y fácil de usar
Trabajan directamente con posiciones de memoria
No pueden ser reasignados Se pueden reasignar, (reuso de punteros)
Las referencias no pueden ser nulas. Pueden tomar el valor de nulo en el flujo del programa
Poco costoso para manejo de funciones.
Poco costoso para manejo de funciones.
56
Contenido
Informática II 2011/2
Programación orientada aobjetos - POO1
Clases y Objetos2
Punteros y Referencias3
Manejo de errores4
58
SOBRECARGADO DE FUNCIONES (POLIMORFISMO)
• Consiste en crear diferentes funciones con el mismo nombre, con el fin de ofrecer al usuario una manera más sencilla de recordar las funciones.
//Algunos protototipos
int funcion(int);
int funcion(long, long);
int funcion(long);/* El programa determina cual de las funciones “funcion” ha
sido llamada, según los parámetros con que sea llamada la función*/
Informática II 2011/2
59
SOBRECARGADO DE LOS MÉTODOS DE LAS CLASES
• Los métodos de las clases también pueden ser sobrecargados como el resto de las funciones, su sintaxis es prácticamente igual.
class Rectangulo
{
public:
// función DibujarFigura() sobrecargada de la clase
void DibujarFigura() const;
void DibujarFigura(int unAncho, int unaAltura) const;
private:
int suAncho;
int suAltura;
};
Informática II 2011/2
void DibujarFigura() const;
void DibujarFigura(int unAncho, int unaAltura) const;
60
SOBRECARGADO DE LOS MÉTODOS DE LAS CLASES
• Los constructores, al ser métodos especiales de las clases también pueden ser sobrecargados, y la manera de hacerlo es igual que el resto de los métodos.
• ¡OJO!, los destructores no pueden ser sobrecargados, ¿Porque?
Informática II 2011/2
Informática II 2011/261
VALORES POR DEFECTO
En el código anterior tenemos que uno de los constructores tiene argumentos de entrada
planteados por defecto
carro(int _gGas,char *_marca="mazda", int _velMax=80);
carro Deportivo(10,"Renault");Aquí no asignamos el último parámetro (int
_velMax) al constructor, este es asignado por defecto como 80.
Informática II 2011/262
VALORES POR DEFECTO
No es posible en la llamada de este constructor en particular, por ejemplo asignar un valor al tercer argumento si no ha sido asignado antes el valor del segundo argumento por defecto.
• carro Deportivo(10, ,50); //no tiene sentido
En cualquier función, o método de una clase es posible instaurar los argumentos por defecto.
63
INICIALIZACIÓN DE LAS VARIABLES MIEMBRO
Informática II 2011/2
Inicialización de variables
Etapa de inicialización
Posible asignar valores por referencia y const
Mas limpio y a menudo mas eficiente.
En el cuerpo del constructor
No se pueden inicializar referencias ni variables const pues genera error de
compilación
Puede contener expresiones y asignaciones
Informática II 2011/264
CONSTRUCTOR COPIA
• Adicionalmente de ser asignado por defecto un constructor y un destructor cuando no son declarados explícitamente en la declaración de la clase, el compilador provee un constructor de copia, que es llamado cada vez que se requiere una copia de un objeto.
#include <iostream>using namespace std;carro Deportivo(10,"BMW",50);//carro carreras=Deportivo;carro carreras(Deportivo); //constructor copia por
defectoint main(){
cout<<Deportivo.getVelMax()<<endl;cout<<carreras.getVelMax()<<endl;return 0;
}
5050
65
CONSTRUCTORES DE COPIA
• Cada vez que se crea una copia de un objeto "El constructor de copia” es ejecutado.
• Por defecto, el constructor de copia simplemente copia cada miembro de una objeto hacia el nuevo objeto. Esta copia se denomina “Copia Superficial”.
//Declaración del constructor de copia
GATO (const GATO &); // constructor de copia
Informática II 2011/2
Informática II 2011/266
1•Cuando se pasa un objeto como argumento a una función o esta lo retorna, se hace una copia temporal de cada una de sus variables miembro.
2•Todo constructor de copia, toma como parámetro una referencia a un objeto de su misma clase.•carro(carro &original);
CONSTRUCTORES DE COPIA
Informática II 2011/267
3• El objetivo del constructor de copia, es crear
una copia exacta de cada variable miembro del objeto pasado como referencia (original). Este copia se denomina “superficial”.
4• Los constructores de copia superficiales
funciona perfectamente cuando se trata de un objeto cuyas variables miembro no son punteros referenciados a variables u objetos alojados en el Heap (free store).
5• En algunas ocasiones se hace necesario
definir personalmente un constructor de copia, que evite que se haga una copia errónea, donde se garantice la independencia de cada objeto con respecto a cada una de sus variables miembro (copia profunda).
CONSTRUCTORES DE COPIA
68
SOBRECARGADO DE LOS OPERADORES
• La sobrecarga de operadores quiere decir que se pueden redefinir algunos de los operadores existentes en C++ para que actúen de una determinada manera, definida por el programador, con los objetos de una clase creada por el mismo.
• La sobrecarga de operadores se emplea para declarar “como es que funciona” dicho operador cuando se utilizan sobre los objetos.
Informática II 2011/2
2+1=0
69
SOBRECARGA DE OPERADORES
• El objetivo de la sobrecarga de operadores es simplificar al máximo el código a escribir, a cambio de complicar algo la definición de las clases. Una clase que disponga de operadores sobrecargados es una clase más compleja de definir, pero más sencilla e intuitiva de utilizar.
Informática II 2011/2
70
SOBRECARGA DE OPERADORES• La sobrecarga de un operador puede ser
declarada de la siguiente forma:
tipodeRetorno operator op (parametros);
Informática II 2011/2
void operator ++ (); // Ejemplo de una declaración para el sobrecargado del operador ++
Void, int, char, …
Palabrareservada
-, --, + , ++, =, ==, …
Void, int, char, …
Informática II 2011/271
1 •Es llamado a través del objeto cont1, el método que sobrecarga el operador preincremento (++).
2 •Dicho método incrementa la variable, y se retorna a sí mismo como referencia (contador&) .
3 •Es llamado el constructor de copia del objeto cont2, el cual recibe como argumento por defecto la referencia de un objeto del mismo tipo (cont1).
EJEMPLO SOBRECARGA DEL OPERADOR PREFIJO
En esta línea de código se presenta los siguientes pasos:contador cont2=++cont1;
Informática II 2011/272
SOBRECARGA DEL OPERADOR DE POSTINCREMENTO
1 •Creamos un objeto temporal copia del objeto original.
2 •Modificamos el valor de la variable del objeto original.
3 •Retornamos el objeto copia temporal.
De este modo, el valor del objeto será modificado, pero en la expresión donde aparezca se tomará el valor antes de modificar.
Informática II 2011/273
SOBRECARGA DE OPERADORES
1
• Un operador puede estar sobrecargado o redefinido varias veces, de tal manera que actúe de un modo distinto dependiendo del tipo de objetos que tenga como argumentos de entrada.
2
• Las ventajas de la sobrecarga de operadores terminan cuando se utiliza de modo que añade complejidad o confusión a los programas. Por ejemplo: no se deberá nunca utilizar el operador (-) para multiplicar matrices o el (+) para imprimir vectores.
3
• Los únicos operadores de C++ que no se pueden sobrecargar son:• El operador punto (.),• El if aritmético (?:)• El operador sizeof, • El scope operator (::)• puntero a miembro de un objeto (.*).
Informática II 2011/275
HERENCIA
Diferentes tipos de objetos usualmente comparten características similares entre sí.
La herencia permite generar nuevos tipos, tomando como base alguno ya implementado.
También hace posible la implementación de jerarquías desde la generalización hasta la especialización de los objetos.
Informática II 2011/276
La programa
ción orientada a objetos permite a las clases heredar
las características y los comportamientos de otras clases
(variables miembro y
los métodos).
Adicionalmente C++, permite definir una
clase modificando una o
más clases ya existentes
.
Estas modificaciones consisten habitualmente en añadir
nuevos miembros
(variables o métodos) a la clase que
se está definiendo,
aunque también se
puede redefinir
variables o funciones
miembro ya existentes.
HERENCIA
Informática II 2011/277
• La clase de la que se parte en este proceso recibe el nombre de clase base, y la nueva clase que se obtiene se denomina clase derivada. Ésta a su vez puede ser clase base en un nuevo proceso de derivación, iniciando de esta manera una jerarquía de clases.
HERENCIA
Informática II 2011/278
CLASE BASE ABSTRACTA
De estas clases no se declara ningún objeto
Su función es la de agrupar miembros comunes de otras clases que se derivarán de ellas.
Por ejemplo, se puede definir la clase vehículo para después derivar de ella carro, moto, bicicleta, etc., pero todos los objetos que se declaren pertenecerán a alguna de estas últimas clases; no habrá vehículos que sean sólo vehículos.
Son Clases que no tiene otra utilidad que la de ser clase base para otras clases se deriven de ella.
La herencia presenta múltiples ventajas, como la posibilidad de reutilizar código sin tener que escribirlo de nuevo. Esto es posible porque todas las clases derivadas pueden utilizar el código de la clase base sin tener que volver a definirlo en cada una de ellas.
Informática II 2011/279
MODIFICADORES DE ACCESO
Tipo de dato de
la clase base
Clase derivada de una
clase base public
Clase derivada de una
clase base private
Otras clases sin relación de
herencia con la clase base
PrivateNo accesible directamente
No accesible directamente
No accesible directamente
Protected Protected PrivateNo accesible directamente
Public Public PrivateAccesible mediante operador (.) o (->)
Informática II 2011/280
NOTAS:
1 •Primero se debe crear la clase base, antes de tratar de crear clases que deriven de esta.
2 •El número de variables miembro de una clase derivada es mayor o igual que el de la clase base.
3•Hay algunos elementos de la clase base que no pueden ser heredados:•Constructores y destructores •Funciones friend •Funciones y datos estáticos de la clase •Operador de asignación (=) sobrecargado
Informática II 2011/281
CONSTRUCTORES Y DESTRUCTORES• Cuando un objeto derivado es creado primero es llamado
el constructor de la clase base y luego el propio.
int vel;
bool on;
int Ncambio;
int acelerar;
Parte vehículo
Objeto carro
Informática II 2011/282
SOBRECARGAR VS REDEFINIR
Cuando se sobrecarga
funciones, el nombre de la función
permanece, pero los argumentos de
entrada y de retorno pueden variar, al igual
que la implementación.
Cuando se redefine una función lo único que cambia es su
implementación. El encabezado
permanece igual (argumento de retorno
y firma) en la clase base como en la
derivada.
83
OCULTANDO LOS MÉTODOS DE LA CLASE BASE
Si la clase base contiene varios métodos sobrecargados, es decir métodos con nombres
iguales pero con argumentos e implementaciones diferentes, y
redefinimos uno de esos métodos dentro de una clase derivada, todos los métodos dentro de la clase base que respondan al mismo nombre
quedaran ocultos, es decir no se podrán acceder a través
del objeto derivado.
Informática II 2011/2
Informática II 2011/284
EJEMPLOclass vehiculo{protected:
int vel;bool on;
public:vehiculo();vehiculo(vehiculo &V);vehiculo(int _vel,bool _on);void setVel(int _vel);int getVel() const;//sobrecarga metodo getVelint getVel(float other);int getVel(int other);virtual vehiculo* clonar();virtual ~vehiculo();
};
class carro: public vehiculo{private:
int Ncambio;int acelerar;
public:carro();carro(int _vel,bool _on);int getVel() const;void cambCambio(int _Ncambio);~carro();
};
carro audi(10,true);
int main(){
int a=5;float b=45.6;//solo podemos acceder a el método heredado redefinidoaudi.getVel();
audi.getVel(a);//para haceder a los demás métodos sobrecargadosaudi.vehiculo::getVel();audi.vehiculo::getVel(a);audi.vehiculo::getVel(b);return 0;
}
cuando se redefine un método
sobrecargado, todas sus variaciones
son escondidas. Si no se desea que
se oculten, entonces se debe
redefinir cada una de las variaciones
o sobrecargas en la clase derivada.
Informática II 2011/285
CONVERSIONES ENTRE CLASE BASE Y DERIVADA
1 •Es posible realizar conversiones o asignaciones de un objeto de una clase derivada a un objeto de la clase base.
2 •Es decir se puede ir de lo más particular a lo más general, aunque en esa operación se pierda información, pues haya variables que no tengan a qué asignarse
3 •Por el contrario las conversiones o asignaciones en el otro sentido, es decir de lo más general a lo más particular, no son posibles, porque puede suceder que no se disponga de valores para todas las variables miembro de la clase derivada.
Informática II 2011/286
Objeto_claseBase= Objeto_claseDerivada;
Objeto_claseDerivada= Objeto_claseBase;
CONVERSIONES ENTRE CLASE BASE Y DERIVADA
Se puede hacer referencia a un objeto de la clase derivada con su dirección contenida en un puntero a la clase base.
vehiculo *ptrV=new carro(30,true);
carro *ptrC=new vehiculo();
Informática II 2011/287
CONVERSIONES ENTRE CLASE BASE Y DERIVADA
using namespace std;
int main(){
vehiculo *ptrV=new carro(30,true);
cout<< ptrV->getVel()<<endl;//se accede al metodo de la clase basereturn 0;
}
88
MÉTODOS VIRTUALES
• Tenemos un problema cuando deseamos acceder al método de la clase derivada a través de un puntero de tipo clase base. Para lograrlo debemos definir el método como virtual dentro de la clase base.
• Para declarar una función como virtual
basta con adicionar la palabra “virtual” al inicio de su prototipo.
Informática II 2011/2
virtual par.retorno declaracionMetodo(parámetros entrada );
Informática II 2011/289
Una vez que un método es declarado como virtual, lo seguirá siendo en las clases derivadas, es decir, la propiedad virtual se hereda
MÉTODOS VIRTUALES
Informática II 2011/290
Por cada clase que utiliza métodos virtuales, se genera una tabla por parte del compilador denominada v-table, que contiene la información de cada uno de los métodos definidos como virtuales.
Cada objeto creado de una clase que tenga una función virtual contiene un puntero oculto a la v-table de su clase. Mediante ese puntero accede a su v-table correspondiente y a través de esta tabla accede a la definición adecuada del método virtual.
En el caso de que en esa clase no esté definido el método virtual en cuestión, el puntero de v-table apuntará a la función virtual de su clase base más próxima en la jerarquía, que tenga una definición propia de la función virtual.
MÉTODOS VIRTUALES
Informática II 2011/291
Esto quiere decir que buscará primero en la propia clase, luego en la clase anterior en el orden jerárquico y se irá subiendo en ese orden hasta dar con una clase que tenga definido el método buscado.
Cuando el compilador llama el método virtual de la clase base, en vez del método de la case derivada, se dice que se presento un “Data Slicing”.
Las funcionalidades de los métodos virtuales, solo pueden ser usadas cuando se trabaja con punteros o referencias de la clase base.
MÉTODOS VIRTUALES
DEFINICIÓN
Definición:• Un array es una colección de
variables del mismo tipo de datos con un mismo nombre.
• Los arrays son un ejemplo de una variable estructurada en la cual:– Hay un numero de piezas
de datos contenidos en el mismo nombre.
– Hay un método ordenado para la extracción de datos individuales del array
EJEMPLO ARREGLOS
Solución 1:Crear una variable especifica por empleado en la cual se almacene la identificación de cada uno de los empleados.
Problema:Supongamos el señor Burns le solicita a usted un programa que le permita llevar un registro de la identificación de cada uno de los empleados de la plata nuclear de Springfield, ¿Cómo lo haría?
EJEMPLO ARREGLOS
Problema solución anterior:El problema se vuelve mas difícil a medida que el numero de empleados aumenta, pues implicara la creación de mas variables individuales (id5, id6, …)
Solución al problema anterior:En los arrays se encuentra la respuesta. Pues un array es como una caja para guardar elementos o como un archivador. Utiliza un sistema de indexación para encontrar el valor de cada una de las variables almacenadas en su interior.
EJEMPLO ARREGLOS
Informática II 2009/297
ARREGLOS DE OBJETOS
• Los arreglos pueden guardar secuencias de datos de cualquier tipo, incluyendo los objetos.
• Si se desea usar un método de un objeto en un arreglo se usa el operador punto (.), tal como se hace con los objetos.
Carro carrosBacanos[2]; // ¡Debe existir un constructor
// por defecto que inicialice cada uno de los objetos!
carrosBacanos[0].acelerar();
ARREGLOS MULTIDIMENSIONALES
• Es posible crear arrays de tantas dimensiones como requieran sus aplicaciones.•Se declaran siguiendo el patrón de la declaración de un vector:
tipo nombre [d1] [d2] [d3]… [dN];
ARREGLOS DE 2 DIMENSIONES
•Declaración
•Ejemplo:tipo nombre [fila] [columna];
int A[2] [3];
A
A[0][0]Nombre
Columnas = 3
Filas = 2
A[0][1] A[0][2]
A[1][0] A[1][1] A[1][2]
A
A[0][0] A[0][1] A[0][2]
A[1][0] A[1][1] A[1][2]
A
A[0][0] A[0][1] A[0][2] A[1][0] A[1][1] A[1][2]
ARREGLOS DE 2 DIMENSIONES
INICIALIZACIÓN ARREGLOS MULTIDIMENSIONALES
matrizA
A[0][0] A[0][1] A[0][2]
A[1][0] A[1][1] A[1][2]
int matrizA [2] [3] = { {3,5,7} , {8,6,4} };
Fila 0 Fila 1
3 5 7
8 6 4
int matrizA [2] [3] = { {3,5,7} , {8,6,4} };
int matrizA [2] [3] = { 3,5,7,8,6,4 };
B[0][0][2] B[0][1][2] B[0][2][2]
B[1][2][2]B[1][0][1] B[1][1][1]
B[0][0][1] B[0][1][1]
B[1][0][1] B[1][1][1] B[1][2][1]
B[0][2][1]
ARREGLOS DE 3 DIMENSIONES•Declaracióntipo nombre [fila] [columna] [Planos];
Int matrizB[2] [3] [3];
matrizB
B[0][0][0]Nombre
Columnas = 3
Filas =
2
B[0][1][0] B[0][2][0]
B[1][0][0] B[1][1][0] B[1][2][0]
Planos = 3
int matrizA [2] [3] [3]={ {{1,3,5}, {7,9,11}}, {{2,4,6}, {8,10,12}},
{{3,7,11}, {15,19,23}} };
Fila 0 Fila 1
1 3 5
7 9 11
Bloque 0
Bloque 1
Bloque 2
2 4 6
8 10 12
3 7 11
15 19 23
F0
F1
C0 C1 C2 C0 C1 C2 C0 C1 C2
Bloque 0 Bloque 1 Bloque 2
ARREGLOS DE 3 DIMENSIONES
USO DEL HEAP PROBLEMAS DE MEMORIA
• Cuando se declara un arreglo, se separa un espacio en memoria fijo para almacenarlo.
• El arreglo se localiza en el stack (limitado).• Heap. Tiene más memoria.• Es posible crear estructuras que se
comportan de manera dinamica
• Arreglos en el heap– Arreglo de apuntadores.
• Diferencia entre apuntador a un arreglo y arreglo de apuntadores
1: CAT FamilyOne[500];2: CAT * FamilyTwo[500];3: CAT * FamilyThree = new CAT[500];
(3) es una variante de (1), muy distinta de (2).
USO DEL HEAP PROBLEMAS DE MEMORIA
• Uso de apuntadores con nombres de arreglos– Los arreglos son apuntadores constantes.
CAT Family[50];– Es un apuntador constante a
&Family[0];– Es legal usar nombres de arreglos como
apuntadores constantes y viceverza.
Family[4];Family + 4;
USO DEL HEAP PROBLEMAS DE MEMORIA
• Arreglos en el Free Store
delete [] Family;
107
DECLARANDO ARREGLOS EN EL HEAP
CAT *Family = new CAT[500];• Por ejemplo, usted puede escribir:
CAT *Family = new CAT[500];
CAT *pCat = Family; //pCat apunta a Family[0]
pCat->SetAge(10); // Establecer Family[0] a 10
pCat++; // avanzar a Family[1]
pCat->SetAge(20); // Establecer Family[1] a 20
Informática II 2011/2
108
LIBERANDO MEMORIA DEL HEAP
• Para liberar toda la memoria reservada por un arreglo en el heap, será necesario usar el comando “delete [ ]” sobre el puntero que apunta a la primera dirección del arreglo.
delete [ ] punteroRebano;
/* Notese que se utiliza los operadores [ ], en caso de no utilizarlos, solo se liberará el primer elemento del arreglo, generando así fugas de memoria*/
Informática II 2011/2
109
OTORGANDO TAMAÑO DE LOS ARREGLOS EN TIEMPO DE EJECUCIÓN• Cuando se utilizan arreglos que se
encuentren ubicados en el heap, será posible asignar su tamaño en tiempo de ejecución, otorgándole gran posibilidad de intercambio a los programas.
Gato pGato = new Gato [vble];
/* ¡Importante!, recuerde liberar la memoria cuando ya no se vaya a usar */
Informática II 2011/2
110
CLASE STRING
• Aunque muchas de las funciones heredadas de C pueden trabajar con los strings, éstas no implementan una solución orientada a objetos.
• En las bibliotecas estándares de C++, es posible encontrar una clase para manipular este tipo de datos. Se denomina la clase “String”.
Investigue al respecto.
Informática II 2011/2
Informática II 2011/2111
CLASE STRINGLa clase string está definida en la cabecera string
(#include <string>)
≠<string> <string.h>La cual no contiene la definición de la clase
string
<cstring.h>que contiene solo las
funciones para trabajar con strings terminados en NULL - por ejemplo para trabajar con char
cadena[45])
Si se incluye el módulo <iostream> no hace falta incluir <string>, porque la segunda está incluida en la primera. Incluir las dos no provoca error y mejora la legibilidad.
Informática II 2011/2112
CLASE STRING
• OperadoresFunciones miembroFunciones externas
http://www.cplusplus.com/reference/string/string/
113
LISTAS ENLAZADAS
• Aunque los arreglos son excelentes contenedores y pueden albergar cualquier tipo de datos, tienen el inconveniente de ser de tamaño fijo.
• Este problema puede arreglarse reasignando su tamaño dinámicamente en tiempo de ejecución; sin embargo, cuando haya que mover, liberar o reasignar memoria muchas veces, puede requerir muchos recursos del pc.
Informática II 2011/2
114
Listas enlazadas
• Las listas enlazadas son estructuras de datos que contienen pequeños contenedores diseñados para enlazarse unos a otros.
• La idea de esta estructura, es que cada uno de los objetos conoce la ubicación del siguiente objeto en la cadena.
Informática II 2011/2
115
Listas enlazadas
• Cada contenedor de la lista se denomina “nodo”.
• Al primer nodo de la lista se le denomina la “cabeza” de la lista, al último la “cola”.
• Existen tres tipos fundamentales de listas:– Enlazados de manera sencilla
– Doblemente enlazadas
– Arboles
Informática II 2011/2
116
Listas enlazadas de manera sencilla
• Cada nodo apunta al siguiente en la lista, nunca en el sentido contrario. Si se desea conocer el valor de un nodo particular, es necesario recorrer toda la lista nodo por nodo desde su inicio.
Informática II 2011/2
117
Listas doblemente enlazadas
• Son aquellas que permiten moverse tanto hacia el siguiente nodo como al anterior, pues en cada uno de ellos guarda dicha información.
Informática II 2011/2
119
Resumen
1 •Una arreglo es una colección de tamaño fijo de objetos que son todos del mismo tipo.
2 •Las matrices no hacen una comprobación de límites. Un error común es escribir para compensar n de una matriz de n miembros.
3
• Los arreglos pueden ser unidimensional o multidimensional. En cualquier caso, todos los miembros del arreglo se pueden inicializar, en cualquier tipo predefinido, tales como int, o los objetos de una clase que tiene un constructor predeterminado.
Informática II 2011/2
120
Resumen
1• Arreglos y su contenido puede estar en el
heap o en la pila. Si elimina un arreglo en el heap, recuerde utilizar los corchetes en la llamada a eliminar.
2• Los nombres de los arreglos son
punteros constantes que apuntan a los primeros elementos del arreglo. Apuntadores y arreglos usan punteros aritméticos para encontrar el siguiente elemento de una matriz.
3• Usted puede crear listas enlazadas para
gestionar colecciones cuyo tamaño no se conoce en tiempo de compilación. De las listas enlazadas, puede crear cualquier número de más estructuras complejas de datos.
4• Las Strings son arreglos de
caracteres( char). C + + proporciona características especiales para la gestión de arreglos tipo char, incluyendo la habilidad para inicializar con cadenas entre comillas.
Informática II 2011/2
Informática II 2011/2122
Polimorfismo
Reescribir funciones Virtuales en las clases derivadas
Relacionar un objeto de una clase derivada con un puntero de clase base en tiempo de ejecución.
Existen ocasiones en que se requiere que un objeto pueda heredar métodos o variables miembros de diferentes clases
tipos polimórficos, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no está especificado.
123
Polimorfismo
• Existen ocasiones en que se requiere que un objeto pueda heredar métodos o variables miembros de diferentes clases.
• Por ejemplo: ¿Que pasa si se tienen dos clases, clase Caballo y clase Pajaro, y se desea crear una nueva clase que tome lo mejor de cada uno de ellos para formar un pegaso?.
Informática II 2011/2
Informática II 2011/2124
Herencia Múltiple
• Es posible crear una nueva clase a partir de más de una clase base. Esto es llamado herencia múltiple .
class Derivada: public Base1, public Base2...{…..
}
Cuando una clase derivada hereda de múltiples clases bases, el compilador asignará la memoria suficiente para alojar sus características y las de sus clases base.
class Pegaso: public Caballo, public Pajaro{…..
}
Pegaso
Pájaro
Caballo
125
Constructores en la herencia múltiple
• En la etapa de inicialización de los constructores de la clase derivada , será posible declarar los constructores de la clase base que deberán ser llamados.
• ¿Que pasa si una clase derivada de varias clases base, hereda un método que tiene la misma firma en todas ellas?
Informática II 2011/2
126
Constructores en la herencia múltiple
• Si se trata de llamar un método heredado de varias clases cuya firma sea igual, el compilador lanzará un error de compilación.
• Existen dos alternativas para instanciar dichos métodos:
• Accediendo explícitamente al método de la clase base que se desea.
• Redefiniendo el método en la función derivada
Informática II 2011/2
127
Herencia de una clase base común
• Para que el compilador pueda compilar de manera adecuada, se deberá introducir explícitamente de cual clase base se tomarán dichos parámetros.
• Ambigüedad:
Int age = pPeg->GetAge();
• Solución:
Int age = pPeg->Horse:: GetAge();
O redeclararla en la clase derivada:virtual int GetAge()const { return Horse::itsAge; }
Informática II 2011/2
128
Herencia de una clase base común
• Cuando se hereda de clases que vengan de la misma línea de herencia, también existe el riesgo de caer en otro tipo de ambigüedad.
• ¿De cual clase superior común debe heredar una clase derivada?
Informática II 2011/2
Caballo Pájaro
Pegaso
AnimalAnimal
129
• class Horse : virtual public Animal• class Bird : virtual public Animal• class Pegasus : public Horse, public Bird
Informática II 2011/2
Herencia de una clase base común
Las clases bases heredadas virtualmente (animal) son inicializadas por sus clases derivadas que se encuentran más abajo en la jerarquía (pegasus).
Por ejemplo la clase base Animal no es inicializada por Horse o Bird sino por Pegasus. Horse y Bird tendrán que inicializar Animal en sus constructores, pero estas inicializaciones serán ignoradas cuando un objeto Pegasus sea creado.
130
Herencia virtual• Habrán ocasiones donde no se desee que una
clase derivada tenga dos copias de la misma clase base compartida.
• En C++ esto será posible declarando a la clase base como virtual.
Informática II 2011/2
Caballo Pájaro
Pegaso
Animal
131
Problemas con la herencia múltiple
• A pesar de que la herencia múltiple ofrece múltiples ventajas sobre la herencia simple, muchos desarrolladores son reacios a utilizarla, pues dicen que correr un debuger en estos sistemas es mucho mas complicado que en la herencia simple.
Informática II 2011/2
132
Tips con la herencia múltiple
1 •Usela sólo cuando verdaderamente necesite crear una clase que herede de múltiples clases.
2• Use herencia virtual
cuando las clases derivadas deban tener una sola instancia hacia su clase base compartida.
3• Cuando use herencia
virtual, asegúrese de inicializar la clase base compartida.Informática II 2011/2
133
Mezclas y clases de capacidad
• Las mezclas es una solución intermedia de la herencia múltiple y la herencia sencilla.
• Una clase de mezcla o capacidad, es una clase que adiciona funcionalidad sin agregar mayor o ningún dato adicional.
Informática II 2011/2
134
Tipos de datos abstractos (TDA)
• Un tipo de dato abstracto (abstract data type ADT) representa un concepto general, por lo tanto no es válido hacer una instancia de un ADT.
• Por ejemplo si se crea un dato abstracto llamado “figura geométrica” no tendría sentido crear un objeto de dicha clase por ser muy general, pero esta serviría como modelo o bosquejo para crear nuevas clases más especificas como “circulo” o “cuadrado”.
Informática II 2011/2
Informática II 2011/2135
• La idea de trabajar con clases abstractas es para agrupar en una clase común las capacidades que tendrán todas sus clases derivadas. Esto facilitará su uso para el usuario final de las clases.
Tipos de datos abstractos (TDA)
136
Tipos de datos abstractos (TDA)
• (TDA) – Funciones virtuales puras
• C++ soporta la creación de clases abstractas por medio del uso de “funciones virtuales puras” que por definición NO podrán ser accedidas directamente.
• //Declaración de funciones virtuales pura
virtual void funcionVirtualPura() { } = 0;Informática II 2011/2
137
Tipos de datos abstractos (TDA)
• (TDA) – Funciones virtuales puras
• Todas las funciones que sean declaradas como virtuales puras deberán ser redefinidas, o el compilador lanzará un error de compilación
• Ninguna función virtual pura podrá ser accedida directamente desde la clase base.
Informática II 2011/2
138
Implementación de funciones virtuales puras
• Aunque no sea posible instanciar directamente las funciones virtuales puras desde las clases abstractas, si será posible acceder a dichos métodos desde las clases derivadas.
Informática II 2011/2
139
Tips funciones virtuales puras
1 •Use tipos de datos abstractos para proporcionar una funcionalidad común en una serie de clases relacionadas.
2 •Sobreescriba todas las funciones virtuales puras en las clases derivadas.
3 •No trate de instanciar un objeto con tipo abstracto de datos(TDA).
Informática II 2011/2
140
Jerarquías complejas de abstracción• Existen ocasiones donde se puede desear
que una clase derivada de una clase abstracta, sea a su vez una clase abstracta, ya sea adicionando nuevos métodos virtuales puros o redefiniendo algunos de éstos.
• La idea de trabajar con clases abstractas es para agrupar en una clase común las capacidades que tendrán todas sus clases derivadas. Esto facilitará su uso para el usuario de las clases.
Informática II 2011/2
141
Bibliografía
• man, ¡no dude en utilizarlo!!• Como Programar en C++ - Deithel &
Deithel Ed. PRENTICE HALL• Sams Teach Yourself C++ in One Hour a
Day, J. Liberty,S. Rao, B. Jones
http://newdata.box.sk/bx/c/
Informática II 2011/2