Professional Documents
Culture Documents
Laboratorios:
Jos Luis Marina jlmarina@nebrija.es Borland Builder 6.0 20% 20% 80% 15% 65% 70%
1
Puntuacin:
Prcticas Laboratorio: Diarias Trabajo Laboratorio Exmen Parcial Exmen Final Exmen Final Extraordinario
3.0EstadodelPrograma
Introduccin a la POO
Historia de la Programacin Conceptos de POO C++ Mi primera Clase
Repaso de Conceptos
Sobrecarga
De Operadores De Funciones
Herencia.
Tipos de Visibilidad
Herencia Mltiple
Polimorfismo
Funciones Virtuales Polimorfismo y Sobrecarga.
Plantillas
Contenedores
Iteradores
3.1Repasodeclasesanteriores.
Estndares
Nombres de Ficheros:
Documentacin Cabeceras de Clases. Nombres de Clases, Objetos, atributos y mtodos Indexado y corchetes Ayudan a: Reutilizar Cdigo a Documentar (Cdigo ms comprensible)
3
3.1Repasodeclasesanteriores.
Programacin Estructurada Funciones
Encapsulan la complejidad Declaracin (.h) :
inttranslate(floatx,floaty,floatz);voidf(void)
Implementacin:
inttranslate(floatx,floaty,floatz) { x=y=z; return33; } //Correcto
3.1Repasodeclasesanteriores.
Programacin Estructurada Operadores
Matemticos Lgicos Unarios Ternario (+ , - , *, /, %) (&&, ||) (-, + , ++, --) Relacionales Bits Direcciones (>, >=, <, <=, ==, !=) (&, |, ^, >>, <<) (&, *, ->)
a=b?b:(b=99);
Casting o Moldeado
Operador sizeof
3.1Repasodeclasesanteriores.
Programacin Estructurada Tipos de Datos
Bsicos: Predefinidos Se combinan con : char, int, float, double) : long y short signed y unsigned.
-- unsigned float )
Creados por el usuario (programador) El compilador aprende a usuarlos. Utiliza las declaraciones (por ejemplo de la clases)
3.4ProgramacinEstructuradaII
Punteros
Cuando se ejecuta un programa, primero se carga en memoria. Se cargan cada uno de sus elemento: main() funciones variables objetos Operador & : Nos permite saber la direccin de memoria de un elemento.
intdog,cat; voidf(intpet) { cout<<"petidnumber:"<<pet<<endl; } intmain() { inti,j; cout<<"f():"<<(long)&f<<endl; cout<<"dog:"<<(long)&dog<<endl; cout<<"i:"<<(long)&i<<endl; cout<<"j:"<<(long)&j<<endl; } f():4198736 dog:4323632 i:6684160 j:6684156
3.4ProgramacinEstructurada
Punteros
Las direcciones de memoria se pueden guardar dentro de otras variables para su uso posterior: Los Punteros. Un puntero se define con el operador * y el tipo de variable a la que apunta.
inti; int*pi; pi=&i;//Punteroaladireccindei. i=33;//Valordei. *pi=55;//Contenidodeloqueapuntapi //Atentoscon: inta,b,c;//Ok int*pa,pb,pc;//NoOK.Solopaespuntero. int*p1; int*p2;//Ok. 6684160 DIRpi
33
6684160
i pi
3.4ProgramacinEstructurada
Punteros: Modificando argumentos.
En el paso-por-valor se realiza una copia del argumento.
#include<iostream> usingnamespacestd; voidf(inta) { cout<<"a="<<a<<endl; a=5; cout<<"a="<<a<<endl; } intmain(){ intx=47; cout<<"x="<<x<<endl; f(x); cout<<"x="<<x<<endl; } #include<iostream> usingnamespacestd; voidf(int*a) { cout<<"a="<<a<<endl; cout<<"*a="<<*a<<endl; *a=5; } intmain(){ intx=47; cout<<"x="<<x<<endl; f(&x); cout<<"x="<<x<<endl; }
En el segundo caso el valor de aes el valor de la direccin de x. Un puntero es casi otro nombre de la misma variable.
9
3.4ProgramacinEstructurada
Referencias de C++.
Es un modo adicional de pasar una direccin a una funcin. Es ms limpio sintcticamente que con punteros.
#include<iostream> usingnamespacestd; voidf(int&a) { cout<<"a="<<a<<endl; cout<<"&a="<<&a<<endl; a=5; } intmain(){ intx=47; cout<<"x="<<x<<endl; f(x);//Parecepasoporvalor cout<<"x="<<x<<endl; } #include<iostream> usingnamespacestd; voidf(int*a) { cout<<"a="<<a<<endl; cout<<"*a="<<*a<<endl; *a=5; } intmain(){ intx=47; cout<<"x="<<x<<endl; f(&x); cout<<"x="<<x<<endl; }
10
3.4ProgramacinEstructurada
Punteros y Referencias como Modificadores de Tipos de Dato
Todas las combinaciones de tipos de dato bsicos, especificadores, punteros y referencias:
voidf1(charc,inti,floatf,doubled); voidf3(unsignedcharuc,unsignedintui, unsignedshortintusi,unsignedlongintuli); voidf4(char*cp,int*ip,float*fp,double*dp); voidf5(shortint*sip,longint*lip, longdouble*ldp); voidf6(unsignedchar*ucp,unsignedint*uip, unsignedshortint*usip, unsignedlongint*ulip); voidf7(char&cr,int&ir,float&fr,double&dr); voidf8(shortint&sir,longint&lir, longdouble&ldr); voidf9(unsignedchar&ucr,unsignedint&uir, unsignedshortint&usir, unsignedlongint&ulir); voidf2(shortintsi,longintli,longdoubleld);
11
3.4ProgramacinEstructurada
Punteros y el tipo void
void* p; Puedo guardar cualquier tipo de direccin en ese puntero. Al asignar a void se pierde la informacin del tipo.
void*vp; charc; inti; floatf; doubled; //Asignoacualquiertipo vp=&c; vp=&i; vp=&f; vp=&d; ........... inti=99; void*vp=&i; *vp=3;//Erroralcompilar //Lomoldeamosaintantes. *((int*)vp)=3; .............
12
3.4ProgramacinEstructurada
mbito o alcance (Scope)
El mbito nos dice cundo es vlida una variable o un objeto. Se extiende desde el punto en que es definida hasta la primera llave que se empareja con la llave de apertura anterior a que la variable fuera definida. Lo define su juego de llaves ms cercanas.
intmain() { intx; { inty; { intz; //Vlidas:x,y,z } //Adisaz. } } //Vlidas:XXXXXXXXXXXXXXX //Vlidas:XXXXXXXX
13
3.4ProgramacinEstructurada
Definicin de Variables al vuelo
El lenguaje C y otros lenguajes procedimentales obligan a declarar todas las variables al principio de un bloque. C++ permite definir variables en cualquier sitio dentro de un mbito Se puede definir una variable justo antes de usarla e inicializarla
{ intq=0; for(inti=0;i<100;i++) { q++;//qvienedembitomayor intp=12;//Cuntodurap? } intp=1;//Esunapdiferente } cout<<"Intro.caracter:"<<endl; while(charc=cin.get()!=q) { cout<<c<<"Noes'q'"<<endl; if(charx=c==a||c==b) cout<<"aob"<<endl; } cout<<"TypeA,B,orC"<<endl; switch(inti=cin.get()) { caseA:cout<<"A"<<endl;break; caseB:cout<<"B"<<endl;break; caseC:cout<<"C"<<endl;break; default:cout<<"Mal!"<<endl; }
14
3.4ProgramacinEstructurada
Memoria y Espacio de Almacenamiento
Variables Globales Se definen fuera de la llaves de las funciones incluida la funcin main(). Estn siempre disponibles. extern: Si estn en un fichero que no es en el que trabajamos ahora
//fichero_uno.cpp #include<iostream.h> intglobal; voidfunc(); intmain() { globe=12; cout<<globe<<endl; func();//Modifiesglobe cout<<globe<<endl; } voidfunc() { global=47; } //fichero_dos.cpp //Accedemosavariableglobalexterna externintglobal; //Alenlazarseresuelvela //referencia
15
3.4ProgramacinEstructurada
Memoria y Espacio de Almacenamiento
Variables Locales Son locales a una funcin ( o bloque {.....} ) y se crean en el rea de almacenamiento automtico. Variables de Registro. Es una variable local que se almacena en uno de los registros de la CPU. Utilizamos la palabra register pata sugerirle al compilador que coloque nuestra variable en un registro y as el acceso sea ms rpido. Variables de Estticas Cada vez que entramos en una funcin se genera el espacio de memoria para las variables y se reinicializan. Con static se le da a una variable una direccin fija constante (Como a una global pero en qu se diferencian?)
voidfunc() { staticinti=0; cout<<"i="<<++i<<endl; } intmain() { for(intx=0;x<10;x++) func(); } //SiquitamosstaticQuepasa? 16
3.4ProgramacinEstructurada
Memoria y Espacio de Almacenamiento
Identificador Espacio de memoria que aloja variable o funcin compilada.
x6 x5 x4 x3 x2 x1
Pila rea de almacenamiento para variables automticas. Variables locales a las funciones.
17
3.4ProgramacinEstructurada
Constantes
#define MAX_BRAZOS 2 const int max_brazos=2;
El preprocesador el que sustituye en todo el cdigo MAX_BRAZOS por 2. No hay comprobaciones sintcticas. No podemos obtener la direccin de MAX_BRAZOS. MAX_BRAZOS no puede ser de un tipo definido por nosotros. max_brazos tiene mbito.
Con const en C++ es igual que una variable pero su valor no se puede cambiar. Podemos utilizar const en la lista de argumentos de una funcin. int suma(const int a, const int b) 18
3.4ProgramacinEstructurada
Valores Constantes
Por defecto se asume que estn en decimal. 10 es diez y no dos 0 al principio 0x al principio Punto flotante Se convierte de forma implcita, pero podemos ayudas utilizando el punto decimal. Tipo char Entre comillas simples char c = 'p'; Caracteres especiales: Octal Hexadecimal 045 0x1fe
Usamos la barra invertida: \n (nueva lnea), \t (tabulacion), \\ (barra invertida), \ (comillas dobles), \ (comilla simple), etc.
19
3.4ProgramacinEstructurada
Registros o Estructuras
Nos permiten agrupar un conjunto de variables en una estructura comn.
structStructure1 { charc; inti; floatf; doubled; }; intmain() { structStructure1s1,s2; s1.c=a;// s1.i=1; s1.f=3.14; s1.d=0.00093; s2.d=0.00093; } typedefstruct { charc; inti; floatf; doubled; }Structure2; intmain() { Structure2s1,s2; s1.c=a;// s1.i=1; s1.f=3.14; s1.d=0.00093; s2.d=0.00093; }
20
3.4ProgramacinEstructurada
Registros o Estructuras
Las estructuras agrupan informacin. Las clases agrupan informacin (atributos) y comportamiento (mtodos).
typedefstructAutoReferencia { inti; AutoReferencia*ar; }AutoReferencia; intmain() { AutoReferenciaar1,ar2; ar1.ar=&sr2; ar2.ar=&sr1; ar1.i=47; ar2.i=1024 cout<<ar1.ar>i;//Qusale? }
i = 47 ar
i = 1024 ar
21
3.4ProgramacinEstructurada
Estructuras y Punteros
Para seleccionar un elemento de una estructura utilizamos '.' Si utilizamos un puntero: '->'
typedefstructStructure3 { charc; inti; floatf; }Structure3; intmain() { Structure3s1,s2; Structure3*sp=&s1; sp>c=a;//Igualques1.c sp>i=1; sp>f=3.14; sp=&s2;//Cambiamos sp>c=a; }
sp
s1 char c ...
s2 char c ...
22
3.4ProgramacinEstructurada
Arrays o Vectores
Permiten agrupar variables una a continuacin de la otra. Todas del mismo tipo.
intmain() { inta[10]; for(inti=0;i<10;i++) { a[i]=i*10; cout<<"a["<<i<<"]="<<a[i]<<endl; } } ThreeDpointp[10]; for(inti=0;i<10;i++) { p[i].i=i+1;//Dos'i'dif. p[i].j=i+2; p[i].k=i+3; } typedefstruct { inti,j,k; }ThreeDpoint;
Accesos muy rpidos. Si indexamos ms all de los lmites: Problemas. No se comprueban los lmites en compilacin. Hay que definir el tamao en tiempo de compilacin. 23
3.4ProgramacinEstructurada
Punteros y Arrays
El nombre de un array sin los corchetes ([x]) nos da la direccin del 1er elemento. No podemos asignarle algo al nombre del array. a[10] .... a=33;
intmain() { inta[10]; cout<<"a="<<a<<endl; cout<<"&a[0]="<<&a[0]<<endl; } intarray1[5],array2[9]; intmain(intargc,char*argv[]) { cout<<"argc="<<argc<<endl; for(inti=0;i<argc;i++) cout<<"argv["<<i<<"]=" <<argv[i]<<endl; } func2(array1,5); func2(array2,9); voidfunc2(int*a,intsize) { for(inti=0;i<size;i++) a[i]=i*i+i; }
24
3.4ProgramacinEstructurada
Aritmtica de Punteros
Lo ms comn es incrementar un puntero en n o en 1 (++). No tiene mucho sentido sumar dos punteros. Y restarlos?
intmain() { inti[10]; doubled[10]; int*ip=i; double*dp=d; cout<<"ip=" ip++; cout<<"ip=" cout<<"dp=" dp++; cout<<"dp=" } ip=6684124 ip=6684128 dp=6684044 dp=6684052
25
3.5Resumen
Estndares Reutilizando Funciones argumentos Control de Flujo if,while,for mbito de Validez Globales, locales static
Programacin Estructurada
Operadores +,--,&&,>> Casting i = (int)l; Tipos de Datos char, int, short int Punteros int* , void* Constantes const int i=0; Almacenamiento Heap, Global Estruturas struct Arrays int a[10];
26