Professional Documents
Culture Documents
Aspectos Avanzados II
1
Programa
Introduccin a la POO Repaso de Conceptos
Historia de la Programacin Conceptos de POO Estndares de Programacin Punteros " Memoria C++ Mi primera Clase E! Control " Operadores
!o#recarga
)e Operadores Creacin )inmica de O#$etos
Herencia*
+ipos de ,isi#ilidad
Herencia M-ltiple
Polimor.ismo
&unciones ,irtuales Polimor.ismo " !o#recarga*
Plantillas
Contenedores
Iteradores
25.1 Repaso
Sobrecarga Hemos visto 0ue las .unciones pod1an ser so#recargadas* )e igual .orma los operadores tam#i2n pueden so#recargarse* En realidad la ma"or1a de los operadores en C++ estn so#recargados* Por e$emplo el operador + realiza distintas acciones cuando los operandos son enteros3 o en coma .lotante* El operador 4 se puede usar como operador de multiplicacin o como operador de indireccin* C++ permite al programador so#recargar a su vez los operadores para sus propios usos*
<tipo> operator <operador> (<argumentos>); <tipo> operator <operador> (<argumentos>) { <sentencias>; }
25.1 Repaso
class Tiempo Sobrecarga de Operadores { public: Tiempo(int h=0, int m=0) : hora_(h), minuto_(m) {} void Mostrar(); Tiempo operator+(Tiempo h); private: int hora_; int minuto_; }; Tiempo Tiempo::operator+(Tiempo h) { Tiempo temp; temp.minuto = minuto + h.minuto; temp.hora = hora + h.hora; if(temp.minuto >= 60) { temp.minuto -= 60; temp.hora++; } return temp; } } int main() { Tiempo Ahora(12,24), T1(4,45); T1 = Ahora + T1; T1.Mostrar(); (Ahora + Tiempo(4,45)).Mostrar(); return 0; } void Tiempo::Mostrar() { cout << hora << ":" << minuto << endl;
Reci#imos un parmetro por copia* Hacemos un retorno por copia* Si Tiempo t !iera p nteros sera imprescindible el constr ctor copia y el operador asignacin" 6
25.1 Repaso
Sobrecarga de operadores
class Tiempo { ... Tiempo operator++(); ... }; Tiempo Tiempo::operator++() { minuto++; while(minuto >= 60) { minuto -= 60; hora++; } return *this; } ... ++T1;
nitarios 7o 8a" parmetro* Act-a so#re 's1 mismo(* Retorno por valor* %so del puntero t8is*
class Fraccional { private: int num_ ; int den_ ; void simplificar_( ) ; public: Fraccional(int n=0, int d=1); Fraccional operator + ( Fraccional f ); Fraccional operator - (Fraccional f); Fraccional operator * (Fraccional f); Fraccional operator / (Fraccional f); int numerador( ); int denominador( ); void numerador (int n); void denominador ( int d); };
,amos a ver las di.erencias entre estas tres declaraciones e implementaciones para seguir comprendiendo la POO
void Fraccional::operator++( ) { num_ = num_ + den_; simplifica() ; } Fraccional f1(1,1),f2; ++f1; ++(++f1); f2 = ++f1; // Nada que incrementar!! // Nada que asignar.
!i vamos a encadenar operaciones no podemos usar esta versin* En caso contrario est #ien " de 8ec8o lo estamos indicando a programadores usuario de nuestra clase <En &raccional*8=*
>
%Modi$ica el objeto receptor de la llamada& !I %#e! el!e algo& El o#$eto receptor incrementado* Problemas' !I*
Fraccional Fraccional::operator++( ) { num_ = num_ + den_; simplifica() ; return *this; } Fraccional f1(1,1),f2; ++f1; f2 = ++f1; ++(++f1); // Error.
!i vamos a encadenar operaciones de incremento no podemos usar esta versin* ,eamos por 0u2****
?
.1 numA 1 denA /
.1 numA 5 denA /
1B
.1 numA 5 denA /
11
.1 numA 5 denA /
1/
.1 numA 5 denA /
El segundo '++( opera so#re la copia 0ue devolvi la .uncin en la llamada anterior*
15
.1 numA 5 denA /
)evolvemos por valor: Otra Copia* 7o .unciona por0ue el segundo incremento act-a so#re la copia 0ue devuelve el primero*
16
%Modi$ica el objeto receptor de la llamada& !I %#e! el!e algo& El propio o#$eto receptor incrementado " no una copia* Problemas' 7O*
Podemos encadenar operaciones sin pro#lemas* Modi.ica el o#$eto receptor " lo devuelve como resultado* Como es una re.erencia esto" tra#a$ando con mi direccin no con una copia*
19
1;
1>
1?
1@
En general es ms -til de.inir los operadores #inarios como .unciones amigas eCternas glo#ales " los unitarios como .unciones miem#ro*
/B